【翻译】Pro LINQ Language Integrated Query in C# 2008 -- 第二章 部分内容
本文介绍了一些复杂的Linq语句的转换写法。
表 2-1. 转换步骤变量
变量 | 说明 | 例子 |
c | 编译器生成的临时变量 | N/A |
e | 一个枚举变量 | from e in customers |
f | 查询字段项或者一个匿名类型 | from e in customers select f |
g | 一个分组项 | from e in s group g by k |
i | 一个假设序列 | from e in s into i |
k | Group或者Join关键字项 | from e in s group g by k |
l | 通过Let引入一个变量 | from e in s let l = v |
o | 一个排序项 | from e in s orderby o |
s | 输入的序列 | from e in s |
v | 一个赋值给Let的值 | from e in s let l = v |
w | 一个where子句 | from e in s where w |
扩展子句里使用Select和Group子句
如果你的查询表达式包含一个扩展子句,进行以下转换:
这里有个例子:
使用后面的转换步骤这最终会转换为:
显示枚举变量类型
如果你的查询表达式包含一个显示指定枚举变量类型的子句,进行以下转换:
使用后面的转换步骤这最终会转换为:
如果你的查询表达式包含一个联合子句,该子句显示指定一个枚举变量类型,进行如下转换:
这里有一个例子:
使用后面的转换步骤这最终会转换为:
提示:当枚举数据集合是C# 旧数据集合其中之一,显示类型枚举变量是必须的,如ArrayList。转换完成时,显示类型枚举变量将旧集合转换成一个实现IEnumerable<T>序列,以便其他查询操作可以执行的序列。
联合子句
如果查询表达式包含一个from子句,一个join子句,没有into延续子句,跟一个Select子句,进行如下转换:
这里有一个例子:
使用后面的转换步骤这最终会转换为:
如果查询表达式包含一个from子句,一个join子句,一个into延续子句,一个select子句,进行如下转换:
这里有一个例子:
使用后面的转换步骤这最终会转换为:
如果一个查询表达式包含一个from子句,一个join子句,没有into延续子句,一个其他任意的select子句,进行如下转换:
注意:现在,有一种代码模式在此转换步骤中匹配第一个代码模式。明确的说,你必须有一个查询表达式包含一个from子句,一个join子句,没有into延续子句,一个select子句。所以编译器将重复此转换步骤。如果一个查询表达式包含一个from子句,一个join子句,into延续子句,一个其他任意的select子句,进行如下转换:
Let和Where子句
如果查询表达式包含一个from子句,立即跟一个Let子句,进行如下转换:
这里是一个例子:
使用后面的转换步骤这最终会转换为:
如果查询表达式包含一个from子句,立即跟一个Where子句,进行如下转换:
这里有个一个例子:
使用后面的转换步骤这最终会转换为:
多个生成器(From)子句
如果查询表达式包含两个from子句,一个select子句,进行如下转换:
这里是一个例子:
使用后面的转换步骤这最终会转换为:
如果查询表达式包含两个from子句,跟一个其他任意select子句,进行如下转换:
这里有一个例子:
使用后面的转换步骤这最终会转换为:
Orderby子句
如果是升序的排序方向,进行如下转换:
这里有一个例子:
使用后面的转换步骤这最终会转换为:
如果任意一个字段为降序排序,转换成OrderByDescending或者ThenByDescending操作。这里的例子和上一个差不多,除了将名称修改成倒序排序:
使用后面的转换步骤这最终会转换为:
Select子句
在查询表达式中,如果select项是和序列枚举变量相同的标示符,意思是你要select序列中存储的所有项,进行如下转换:
这里有一个例子:
如果select项是和序列枚举变量标示符不相同,意思是你要 select 除了序列中存储的全部项以外的其他项 (例如一个成员项或者一个匿名变量类型)来构造若干个成员项,进行如下转换:
这里有一个例子:
Group子句
在查询表达式中,如果group项与序列枚举标示符相同,意思是你group整个序列中存储的某一项,进行如下转换:
这里有一个例子:
如果group项不同于序列枚举的标示符,意思是你group整个序列中存储的某些项,并将这些项存储在一个序列中,进行如下转换:
这里有一个例子:
这里的所有转换步骤都是完成,查询表达式完全转换成标准“.”表示法语法。