【翻译】Pro LINQ Language Integrated Query in C# 2008 -- 第二章 部分内容

本文详细介绍了复杂的Linq查询表达式的转换步骤,包括从简单的枚举到复杂的Group和Join子句的转换,以及如何处理Let和Where子句等。通过实际例子展示了如何将Linq查询表达式转换为标准的.表示法语法。

本文介绍了一些复杂的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
kGroup或者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子句

如果你的查询表达式包含一个扩展子句,进行以下转换:

image

这里有个例子:

image

使用后面的转换步骤这最终会转换为:

image

显示枚举变量类型

如果你的查询表达式包含一个显示指定枚举变量类型的子句,进行以下转换:

image 

image

使用后面的转换步骤这最终会转换为:

image

如果你的查询表达式包含一个联合子句,该子句显示指定一个枚举变量类型,进行如下转换:

image

这里有一个例子:

image

使用后面的转换步骤这最终会转换为:

image

提示:当枚举数据集合是C# 旧数据集合其中之一,显示类型枚举变量是必须的,如ArrayList。转换完成时,显示类型枚举变量将旧集合转换成一个实现IEnumerable<T>序列,以便其他查询操作可以执行的序列。

联合子句

如果查询表达式包含一个from子句,一个join子句,没有into延续子句,跟一个Select子句,进行如下转换:

image

这里有一个例子:

image

使用后面的转换步骤这最终会转换为:

image

如果查询表达式包含一个from子句,一个join子句,一个into延续子句,一个select子句,进行如下转换:

image

这里有一个例子:

image

使用后面的转换步骤这最终会转换为:

image

如果一个查询表达式包含一个from子句,一个join子句,没有into延续子句,一个其他任意的select子句,进行如下转换:

image

注意:现在,有一种代码模式在此转换步骤中匹配第一个代码模式。明确的说,你必须有一个查询表达式包含一个from子句,一个join子句,没有into延续子句,一个select子句。所以编译器将重复此转换步骤。如果一个查询表达式包含一个from子句,一个join子句,into延续子句,一个其他任意的select子句,进行如下转换:

image

Let和Where子句

如果查询表达式包含一个from子句,立即跟一个Let子句,进行如下转换:

image

这里是一个例子:

image

使用后面的转换步骤这最终会转换为:

image

如果查询表达式包含一个from子句,立即跟一个Where子句,进行如下转换:

image

这里有个一个例子:

image

使用后面的转换步骤这最终会转换为:

image

多个生成器(From)子句

如果查询表达式包含两个from子句,一个select子句,进行如下转换:

image

这里是一个例子:

image

使用后面的转换步骤这最终会转换为:

image

如果查询表达式包含两个from子句,跟一个其他任意select子句,进行如下转换:

image

这里有一个例子:

image

使用后面的转换步骤这最终会转换为:

image

Orderby子句

如果是升序的排序方向,进行如下转换:

image

这里有一个例子:

image

使用后面的转换步骤这最终会转换为:

image

如果任意一个字段为降序排序,转换成OrderByDescending或者ThenByDescending操作。这里的例子和上一个差不多,除了将名称修改成倒序排序:

image

使用后面的转换步骤这最终会转换为:

 image

Select子句

在查询表达式中,如果select项是和序列枚举变量相同的标示符,意思是你要select序列中存储的所有项,进行如下转换:

image

这里有一个例子:

image

如果select项是和序列枚举变量标示符不相同,意思是你要 select  除了序列中存储的全部项以外的其他项 (例如一个成员项或者一个匿名变量类型)来构造若干个成员项,进行如下转换:

image

这里有一个例子:

image

Group子句

在查询表达式中,如果group项与序列枚举标示符相同,意思是你group整个序列中存储的某一项,进行如下转换:

image

这里有一个例子:

image

如果group项不同于序列枚举的标示符,意思是你group整个序列中存储的某些项,并将这些项存储在一个序列中,进行如下转换:

 image

这里有一个例子:

image 

这里的所有转换步骤都是完成,查询表达式完全转换成标准“.”表示法语法。

转载于:https://www.cnblogs.com/winnerzone/archive/2008/03/28/1127589.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值