LINQ查询表达式基础

LINQ,语言集成查询(Language Integrated Query)是一组用C#和Visual Basic语言的扩展。

对于编写查询的开发人员来说,LINQ 最明显的“语言集成”部分是查询表达式。查询表达式是使用 C# 3.0 中引入的声明性查询语法编写的。通过使用查询语法,你甚至可以使用最少的代码对数据源执行复杂的筛选、排序和分组操作。你使用相同的基本查询表达式模式来查询和转换 SQL 数据库、ADO.NET 数据集、XML 文档和流以及 .NET 集合中的数据。

下面我们通过一些实际中常用的功能举例来学习一下。

1.简单数组的一些基本操作

查询数组中大于80的分数。

1             int[] scores = new int[] { 97, 92, 81, 60 };
2
3             IEnumerable<int> scoreQuery = from score in scores
4                                           where score > 80
5                                           select score;6
7             foreach(int score in scoreQuery)
8             {
9                 Console.WriteLine(score);
10            }

查询数组中大于80的分数,按照升序ascending排列(默认为降序descending ),并且格式化结果。

 1             int[] scores = new int[] { 97, 92, 81, 60 };
 2
 3             IEnumerable<string> scoreQuery = from score in scores
 4                                           where score > 80
 5                                           orderby score ascending
 6                                           select String.Format("Score: {0}",score);
 7
 8             foreach(string score in scoreQuery)
 9             {
10                 Console.WriteLine(score);
11             }

2.数组列表的一些基本操作
这里首先创建一个程序员Programer类,包含了ID,Name,Age,Language属性。

1     public class Programer
2     {
3         public int ID;
4         public string Name;
5         public int Age;
6         public string Language;
7     }

然后创建一个Programer类型的测试数组列表。查找编程语言使用C#的程序员。结果将输出Name1和Name4。

 1             Programer[] programers = new Programer[]{
 2                 new Programer{ID=1,Name="Name1",Age=25,Language="C#"},
 3                 new Programer{ID=2,Name="Name2",Age=28,Language="Visual  Basic"},
 4                 new Programer{ID=3,Name="Name3",Age=30,Language="C++"},
 5                 new Programer{ID=4,Name="Name4",Age=30,Language="C#"},
 6                 new Programer{ID=5,Name="Name5",Age=35,Language="C"}
 7             };
 8
 9             IEnumerable<Programer> programerQuery =
10                 from p in programers
11                 where p.Language == "C#"
12                 select p;
13
14             foreach(var item in programerQuery)
15             {
16                 Console.WriteLine(item.Name);
17             }

同样,这里也可以根据需要进行排序,对结果格式化等操作。下面查找编程语言使用C#的程序员,按Age升序排列,结果格式化输出Name和Age。

 1             Programer[] programers = new Programer[]{
 2                 new Programer{ID=1,Name="Name1",Age=25,Language="C#"},
 3                 new Programer{ID=2,Name="Name2",Age=28,Language="Visual Basic"},
 4                 new Programer{ID=3,Name="Name3",Age=30,Language="C++"},
 5                 new Programer{ID=4,Name="Name4",Age=30,Language="C#"},
 6                 new Programer{ID=5,Name="Name5",Age=35,Language="C"}
 7             };
 8
 9             IEnumerable<string> programerQuery =
10                 from p in programers
11                 where p.Language == "C#"
12                 orderby p.Age ascending
13                 select String.Format("Name: {0} , Age: {1}", p.Name, p.Age);
14
15             foreach(var item in programerQuery)
16             {
17                 Console.WriteLine(item);
18             }

对于查询的结果,我们还可以根据需要选取部分数据。下面我们只需要程序员列表中的Name和Language数据。

 1             Programer[] programers = new Programer[]{
 2                 new Programer{ID=1,Name="Name1",Age=25,Language="C#"},
 3                 new Programer{ID=2,Name="Name2",Age=28,Language="Visual Basic"},
 4                 new Programer{ID=3,Name="Name3",Age=30,Language="C++"},
 5                 new Programer{ID=4,Name="Name4",Age=30,Language="C#"},
 6                 new Programer{ID=5,Name="Name5",Age=35,Language="C"}
 7             };
 8
 9             var newProgramers = from p in programers
10                                 select new
11                                 {
12                                    Name = p.Name,
13                                    Language = p.Language
14                                 };
15
16             foreach(var item in newProgramers)
17             {
18                 Console.WriteLine("Name: {0} , Language: {1}", item.Name, item.Language);
19             }

当我们需要知道每种编程语言都有哪些程序员,我们就需要用到Group分组功能。

 1             Programer[] programers = new Programer[]{
 2                 new Programer{ID=1,Name="Name1",Age=25,Language="C#"},
 3                 new Programer{ID=2,Name="Name2",Age=28,Language="Visual Basic"},
 4                 new Programer{ID=3,Name="Name3",Age=30,Language="C++"},
 5                 new Programer{ID=4,Name="Name4",Age=30,Language="C#"},
 6                 new Programer{ID=5,Name="Name5",Age=35,Language="C"}
 7             };
 8
 9             var programerGroupByLanguage = from p in programers
10                                            group p by p.Language;
11
12             foreach (var group in programerGroupByLanguage)
13             {
14                 Console.WriteLine("Group: {0}", group.Key);
15                 foreach(var item in group)
16                 {
17                     Console.WriteLine(item.Name);
18                 }
19                 Console.WriteLine();
20             }

当我们想计算有多少程序员知道某种开发语言。在使用Group子句对开发语言进行分组后,可以使用Into子句将Group的子句结果存储在临时变量中。之后可以使用此变量来执行其他查询。

 1             Programer[] programers = new Programer[]{
 2                 new Programer{ID=1,Name="Name1",Age=25,Language="C#"},
 3                 new Programer{ID=2,Name="Name2",Age=28,Language="Visual Basic"},
 4                 new Programer{ID=3,Name="Name3",Age=30,Language="C++"},
 5                 new Programer{ID=4,Name="Name4",Age=30,Language="C#"},
 6                 new Programer{ID=5,Name="Name5",Age=35,Language="C"}
 7             };
 8
 9             var programerGroupByLanguage = from p in programers
10                                            group p by p.Language into languageGroup
11                                            select new
12                                            {
13                                                Language = languageGroup.Key,
14                                                Count = languageGroup.Count()
15                                            };
16
17             foreach (var group in programerGroupByLanguage)
18             {
19                 Console.WriteLine("Language {0} have {1} programers", group.Language, group.Count);
20             }

3.多个数组列表的一些基本操作

创建两个类,Product产品类和Category类别类,每个产品分配一个类别。

 1     public class Category
 2     {
 3         public int CategoryID { get; set; }
 4         public string CategoryName { get; set; }
 5     }
 6
 7     public class Product
 8     {
 9         public int ProductID { get; set; }
10         public string ProductName { get; set; }
11         public int CategoryID { get; set; }
12         public string Description { get; set; }
13     }

接着创建一些Category类型和Product类型的测试数组列表。

下面我们按类别查询所有产品。

 1             Category[] categories = new Category[]{
 2                 new Category{CategoryID=1,CategoryName="TOYOTA"},
 3                 new Category{CategoryID=2,CategoryName="BMW"},
 4                 new Category{CategoryID=3,CategoryName="BENZ"},
 5                 new Category{CategoryID=4,CategoryName="HONDA"},
 6                 new Category{CategoryID=5,CategoryName="LEXUS"}
 7             };
 8
 9             Product[] products = new Product[]{
10                 new Product{ProductID=1,ProductName="Car1",CategoryID=1,Description="TOYOTA Car"},
11                 new Product{ProductID=2,ProductName="Car2",CategoryID=1,Description="TOYOTA SUV"},
12                 new Product{ProductID=3,ProductName="Car3",CategoryID=2,Description="BMW Car"},
13                 new Product{ProductID=4,ProductName="Car4",CategoryID=2,Description="BMW SUV"},
14                 new Product{ProductID=5,ProductName="Car5",CategoryID=3,Description="BENZ Car"},
15                 new Product{ProductID=6,ProductName="Car6",CategoryID=4,Description="HONDA Car"},
16                 new Product{ProductID=7,ProductName="Car7",CategoryID=5,Description="LEXUS Car"},
17                 new Product{ProductID=8,ProductName="Car8",CategoryID=5,Description="LEXUS SUV"}
18             };
19
20             var productByCategoryResult1 = from c in categories
21                                     join p in products
22                                     on c.CategoryID equals p.CategoryID
23                                     select new
24                                     {
25                                         c.CategoryName,
26                                         p.ProductName,
27                                         p.Description
28                                     };
29
30             var productByCategoryResult2 = from c in categories
31                                     from p in products
32                                     where c.CategoryID ==p.CategoryID
33                                     select new
34                                     {
35                                         c.CategoryName,
36                                         p.ProductName,
37                                         p.Description
38                                     };
39
40             Console.WriteLine("Result 1:");
41             foreach(var item in productByCategoryResult1)
42             {
43                 Console.WriteLine(item);
44             }
45
46             Console.WriteLine("Result 2:");
47             foreach (var item in productByCategoryResult2)
48             {
49                 Console.WriteLine(item);
50             }

我们看到使用多个from和使用join查询出的结果是一样的。

当我们需要统计每种类别下的产品时,也就是对类别进行分组,只需加上into到某个变量语句即可,此时这个变量将自动对产品的结果集进行分组。

 1             var productByCategoryResult = from c in categories
 2                                     join p in products
 3                                     on c.CategoryID equals p.CategoryID
 4                                     into CategoryProducts
 5                                     select new
 6                                     {
 7                                         c.CategoryName,
 8                                         Products=CategoryProducts
 9                                     };
10
11
12             foreach (var item in productByCategoryResult)
13             {
14                 Console.WriteLine("Category: {0}",item.CategoryName);
15                 foreach(var product in item.Products)
16                 {
17                     Console.WriteLine("{0} ({1})", product.ProductName, product.Description);
18                 }
19             }

如果要将子表达式的结果存储在变量中以便来执行其他操作,可以使用Let子句。例如这里需要统计分配给类别的产品数量。

 1              var productByCategoryResult = from c in categories
 2                                     join p in products
 3                                     on c.CategoryID equals p.CategoryID
 4                                     into CategoryProducts
 5                                     let productCount=CategoryProducts.Count()
 6                                     select new
 7                                     {
 8                                         c.CategoryName,
 9                                         Count=productCount
10                                     };
11
12
13             foreach (var item in productByCategoryResult)
14             {
15                 Console.WriteLine("Category {0} have {1} products", item.CategoryName, item.Count);
16             }

好了,本篇就先到此,希望对你有所帮助,谢谢!

时间: 2024-10-30 16:52:02

LINQ查询表达式基础的相关文章

LINQ查询表达式(1) - 查询表达式基础

什么是查询?它有什么用途? "查询"是指一组指令,这些指令描述要从一个或多个给定数据源检索的数据以及返回的数据应该使用的格式和组织形式. 查询不同于它所产生的结果.通常,源数据会在逻辑上组织为相同种类的元素序列. SQL 数据库表包含一个行序列. 与此类似,ADO.NET DataTable 包含一个 DataRow 对象序列. 在 XML 文件中,有一个 XML 元素"序列"(不过这些元素按分层形式组织为树结构). 内存中的集合包含一个对象序列.从应用程序的角度来

LINQ查询表达式---------let子句

LINQ查询表达式---------let子句 let子句创建一个范围变量来存储结果,变量被创建后,不能修改或把其他表达式的结果重新赋值给它.此范围变量可以再后续的LINQ子句中使用. class Program { static void Main(string[] args) { int[] number = { 12, 15, 16, 17, 18, 19, 20 }; var query = from num in number let n = num % 2 where n == 0

Linq专题之创建Linq查询表达式

本节我们主要介绍一下如何创建查询集合类型,关系数据库类型,DataSet对象类型和XML类型的数据源的Linq查询表达式. 下面在实例代码ReadyCollectionData()函数创建了准备的数据源: 1.创建集合类型的查询. 创建一个UserBaseInfo类: 1 public class UserBaseInfo 2 { 3 private List<string> aliasname; 4 private int id; 5 private string email; 6 priv

LINQ 查询表达式(C# 编程指南)

语言集成查询 (LINQ) 是一组技术的名称,这些技术建立在将查询功能直接集成到 C# 语言(以及 Visual Basic 和可能的任何其他 .NET 语言)的基础上.  借助于 LINQ,查询现在已是高级语言构造,就如同类.方法.事件等等. 对于编写查询的开发人员来说,LINQ 最明显的"语言集成"部分是查询表达式.  查询表达式是使用 C# 3.0 中引入的声明性查询语法编写的.  通过使用查询语法,您甚至可以使用最少的代码对数据源执行复杂的筛选.排序和分组操作.  您使用相同的

Linq学习之旅——LINQ查询表达式

1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. 概述 LINQ的全称是Language Integrated Query,中文译成“语言集成查询”.LINQ作为一种查询技术,首先要解决数据源的封装,大致使用了三大组件来实现这个封装,分别是LINQ to Object.LINQ to ADO.NET.LINQ to XML.它们和.NET语言的关系如下:

LINQ之路 5:LINQ查询表达式

书写LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询表达式(Query Expression). LINQ方法语法的本质是通过扩展方法和Lambda表达式来创建查询.C# 3.0对于LINQ表达式还引入了声明式的查询表达式,也叫查询语法,通常来讲,它是创建LINQ查询的更加快捷的方式.尽管通过查询语法写出的查询比较类似于SQL查询,但实际上查询表达式的产生并不是建立在SQL之上,而是建立在函数式编程语言如LISP和Haskell中的list comprehensio

LINQ查询表达式(3) - LINQ 查询分组

对查询结果进行分组 分组是 LINQ 最强大的功能之一. 下面的示例演示如何以各种方式对数据进行分组: 按照单个属性. 按照字符串属性的首字母. 按照计算出的数值范围. 按照布尔谓词或其他表达式. 按照复合键. 此外,最后两个查询将它们的结果投影到一个新的匿名类型中,该类型仅包含学生的名字和姓氏. //单个属性作为组键对源元素进行分组 var queryLastNames = from student in students group student by student.LastName i

查询表达式和LINQ to Objects

查询表达式实际上是由编译器“预处理”为“普通”的C#代码,接着以完全普通的方式进行编译.这种巧妙的发式将查询集合到了语言中,而无须把语义改得乱七八糟 LINQ的介绍 LINQ中的基础概念 降低两种数据模型之间的阻抗失配过程中,遇到的一个问题就是,通常会涉及创建另一个模型来作为桥梁 序列 它通过IEnumerable和IEnumerable<T>接口进行封装 序列和其他集合数据结构最大的区别:当你从序列读取数据的时候,通常不知道还有多少数据项等待读取,或者不能访问任意的数据项——只能是当前这个

LINQ查询基础

一.什么是LINQ LINQ是Language Integrate Query的缩写,意为语言集成查询,是微软在.Net Framework 4.5版中推出的主要特性之一. 它为开发人员提供了统一的数据查询模式,并与.Net开发语言(如C#和VB.Net)集成,很大程度上简化了数据查询的编码和调试工作,提供了数据查询的性能. LINQ中查询表达式访问的是一个对象,而该对象可以表示为各种类型的数据源.比如SQL Server数据库,XML文档,ADO.NET数据集,以及内存中的数据集合等. 在.N