LINQ
LINQ的构架
从这幅图中,我们可以知道LINQ包括五个部分:LINQ to Objects、LINQ to XML、LINQ to SQL、LINQ to DataSet、LINQ to Entities。
目前,还可以下载其他第三方提供程序,例如LINQ to JSON、LINQ to MySQL、LINQ to Amazon、LINQ to Flickr和LINQ to SharePoint。无论使用什么数据源,都可以通过LINQ使用相同的API进行操作。
LINQ操作语法
LINQ查询时有两种语法可供选择:查询表达式(Query Expression)和方法语法(Fluent Syntax)。
.NET公共语言运行库(CLR)并不具有查询表达式的概念。所以,编译器会在程序编译时把查询表达式转换为方法语法,即对扩展方法的调用。所以使用方法语法会让我们更加接近和了解LINQ的实现和本质,并且一些查询只能表示为方法调用。但另一方面,查询表达式通常会比较简单和易读。不管怎样,这两种语法是互相补充和兼容的,我们可以在一个查询中混合使用查询表达式和方法语法。
.net的设计者在类库中定义了一系列的扩展方法来方便用户操作集合对象,这些扩展方法构成了LINQ的查询操作符。
以下扩展方法存在对应的查询表达式关键字:Where、Select、SelectMany、OrderBy、ThenBy、OrderByDescending、ThenByDescending、GroupBy、Join、GroupJoin。
LINQ查询表达式
表达式的语法如下:
from [type] id in source
[join [type] id in source on expr equals expr [into subGroup]]
[from [type] id in source | let id = expr | where condition]
[orderby ordering,ordering,ordering...]
select expr | group expr by key
[into id query]
第一行:
type是可选的,id是集合中的一项,source是一个集合,如果集合中的类型与type指定的类型不同则导致强制转化
第二行:
一个查询表达式中可以有0个或多个join子句,
这里的source可以不等于第一句中的source
expr可以是一个表达式
[into subGroup] subGroup是一个中间变量,它继承自IGrouping,代表一个分组,也就是说“一对多”里的“多”
可以通过这个变量得到这一组包含的对象个数,以及这一组对象的键
第三行:
一个查询表达式中可以有1个或多个from子句
一个查询表达式中可以有0个或多个let子句,let子句可以创建一个临时变量
一个查询表达式中可以有0个或多个where子句,where子句可以指定查询条件
第四行:
一个查询表达式可以有0个或多个排序方式
每个排序方式以逗号分割
第五行:
一个查询表达式必须以select或者group by结束
select后跟要检索的内容
group by 是对检索的内容进行分组
第六行:
最后一个into子句起到的作用是将前面语句的结果作为后面语句操作的数据源
LINQ to Objects
LINQ to Objects是LINQ的精华部分。
LINQ to Objects 提供对内存中集合操作的支持,由程序集System.Core.dll中System.Linq命名空间下的Enumerable静态类提供。
这些扩展方法都是针对IEnumerable的对象进行扩展的也就是说,只要实现了IEnumerable接口,就可以使用这些扩展方法。