(1)透明标识符

有些翻译步骤要使用透明标识符(*)插入枚举变量。

透明标识符只在翻译过程中存在,翻译结束将不再出现。

(2)翻译步骤

①带有into连续语句的SelectGroup语句

from...into...                  ->  from i in
from ...
...
例如:
from c in customers from g in
group c by c.Country into g -> from c in coustomers
select new group c by c.Country
{ select new
Country = g.Key, {
CustCount = g.Count() Country = g.Key,
} CustCount = g.Count()
}

最后的翻译为:

customer.GroupBy(c=> c.Country)
.Select( g=> new { Country = g.Key, CustCount = g.Count() })

②显示枚举变量类型

2.1.如果查询表达式包含一个from语句,并且这条语句显示指定了一个枚举变量类型

from T e in s                  ->     from e in s.Cast<T>()
例如: from Customer c in customers -> from c in customers.Cast<Customer>()
select c

最后结果:

customers.Cast<Customer>()

2.2.如果查询表达式包含一个join语句,并且这条语句显示指定一个枚举变量类型

join T e n s                                    join e in s.Cast<T>()
on k1 equals k2 -> on k1 equals k2
例如: from c in customers from c in customers
join Order o in orders join o in orders.Cast<Order>()
on c.CustomerID equals o.CustomerID -> on c.CustomerID equals o.CustomerID
select new { select new {
c.Name,o.OrderDate,o.Tatal c.Name,o.OrderDate,o.Tatal
} }

最后的结果:

customers
.Join(orders.Cast<Order>(),
c => c.CustomerID,
o => o.CustomerID,
(c,o) => new { c.Name,o.OrderDate,o.Tatal }
)

③Join语句

3.1.如果查询表达式包含一个from语句,后面跟一个join语句,但是在select语句没有使用into连续语句时,

from e1 in s1							from t in s1
join e2 in s2 -> .Join(s2,
on k1 equals k2 e1 => k1,
select f e2 => k2,
(e1,e2) => f)
select t
例如:
from c in customers from t in customers
join o in orders .Join(orders,
on c.CustomerID equals o.CustomerID -> c=>c.CustomerID,
select new { o=>o.CustomerID,
c.Name,o.OrderDate,o.Tatal (c,o) => new {
} c.Name,o.OrderDate,o.Tatal
}) select t

最后的结果:

cusotmers
.Join(orders,
c => c.CustomerID,
o => o.CustomerID,
(c,o) => new { c.Name,o.OrderDate,o.Tatal })

3.2.如果表达式包含一个from,后面跟一个join语句,并且select语句后面带有into连续语句时,

from e1 in s1						from t in s1
join e2 in s2 .GroupJoin(s2,
on k1 equals k2 -> e1 => k1,
into i e2 => k2,
select f (e1, i) => f)
select t

例如:

	from c in customers								from t in customers
join o in orders .GroupJoin(oders,
on c.CustomerID equals o.CustomerID c => c.CustomerID,
into co -> o => o.CustomerID,
select new (c,co) => new
{ c.Name, Sum => co.Sum(o => o.Total) } { c.Name,
Sum => co.Sum(
o => co.Total) }
select t

最后的结果:

cusotmers
.GroupJoin(orders,
c => c.CustomerID,
o => o.CustomerID,
(c,co) => new { c.Name, Sum =co.Sum(o = o.Tatal) })

3.3.如果查询表达式包含一个from语句,后面跟一个join语句,并且在select语句之外的其他语句后面没有带into连续语句时,

from e1 in s1						from * in
join e2 in s2 from e1 in s1
on k1 equals k2 -> from e2 in s2
... on k1 equals k2
select new { e1, e2 }

  代码中有一个代码模式与这个翻译步骤中的第一个代码模式匹配。特别地,代码中还有一个查询表达式,该表达式包含一个from语句,后面一个join语句,并且select语句后面没有跟into连续语句。这样,编译器将重复这个翻译步骤

3.4.如果查询表达式包含一个from 语句,后面一个join,并且在select语句之外的其他语句后带有into连续语句,

from e1 in s1						from * in
join e2 in s2 from e1 in s1
on k1 equals k2 -> from e2 in s2
into i on k1 equals k2
... into i
select new { e1,e2 }

这次代码有一个模式与翻译步骤第二个代码模式匹配。特别地,代码中还有一个表达式,包含一个from语句,后面跟一个join语句,并且select语句后面带有一个into连续语句。这样编译器将重复这个翻译步骤。

④Let和Where语句

4.1 Let语句

from e in s					from * in
let l = v -> from e1 in s1
select new { e, l = v}

例如,(t是一个编译器生成的标识符,对于编写的任何代码都是不可见和不可访问的)

from c in  customers							from * in
let cityStateZip = from c in customers
c.City + "," + c.State + " " + c.Zip -> select new {
select new { c.Name , cityStateZip } c,
cityStateZip =
c.City + "," + c.State + " " + c.Zip }
select new { c.Name , cityStateZip }

最后的结果:

customers
.Select(c => new { c , cityStateZip = c.City + "," + c.State + " " + c.Zip })
.Select(c => new { t.c.Name, t.cityStateZip })

4.2.查询表达式包含一个from,并紧跟一个where语句,

from e in s				-> 		from e in s
where w .Where( e => w)

例如:

from c in customers					from c in customers
where c.Country == "USA" -> .Where(c => c.Country == "USA")
select new { c.Name, c.Country} select new { c.Name, c.Country }

最后的结果:

customers
.Where(c => c.Country == "USA" )
.Select(c => new { c.Name, c.Country })

⑤多个(From)语句

5.1.如果查询表达式包含两个from语句,后面一个select语句

from e1 in s1			from c in s1
from e2 in s2 -> .SelectMany(e1 => from e2 in s2
select f select f )
select c

例如:(t 是编译器临时产生的变量)

from c in customers						from t in customers
from o in c.Orders .SelectMany(c => from o in c.Orders
select new -> select new {
{ c.Name, o.OrderID, o.OrderDate } c.Name, o.OrderID, o.OrderDate
})
select t

最后的结果

customers
.SelectMany(c => c.Orders
.Select(o => new{ c.Name, o.OrderID, o.OrderDate }))

5.2.如果查询表达式包含两个from语句,后面select之外的其他语句,

	from e1 in s1				from * in
from e2 in s2 from e1 in s1
... -> from e2 in s2
select new { e1 ,e2 }

例如,

from c in customers							from o in c.Orders
from o in c.Orders select new { c,o }
orderby o.OrderDate descending -> orderby o.OrderDate descending
select new select new
{ c.Name, o.OrderID, o.OrderDate } { c.Name, o.OrderID, o.OrderDate }

最后的翻译:

customers
.SelectMany(c => c.Orders.Select(o => new { c,o }))
.OrderByDescending(t => t.o.OrderDate)
.Select(t => new { t.c.Name, t.o.OrderID, t.o,OrderDate })

《LINQ技术详解C#》-2.查询表达式翻译为标准查询操作符的更多相关文章

  1. Linq学习总结1--参考Linq技术详解

    2个要点: 1.linq操作的集合必须实现IEnumerable接口,所以在这3.0之前为实现该接口的集合需通过Cast或TypeOf方法转换成可Linq的集合; 2.查询式和Lame那啥表达式都可以 ...

  2. 《LINQ技术详解C#》-4.LINQ到对象

    public static string[] Presidents { get; } = { "Adams", "Arthur", "Buchanan ...

  3. 《LINQ技术详解C#》-5.非延迟操作符

    1.转换操作符 1.ToArray 从一个类型为T的输入序列创建一个类型为T的数组. 2.ToList 从一个类型为T的序列创建一个类型为T的列表. 3.ToDictionary 从类型为T的序列创建 ...

  4. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  5. Linq之旅:Linq入门详解(Linq to Objects)【转】

    http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html Linq之旅:Linq入门详解(Linq to Objects) 示例代码下载:Linq之 ...

  6. Linq之旅:Linq入门详解(Linq to Objects)(转)

    http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html 示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细 ...

  7. 《python开发技术详解》|百度网盘免费下载|Python开发入门篇

    <python开发技术详解>|百度网盘免费下载|Python开发入门篇 提取码:2sby  内容简介 Python是目前最流行的动态脚本语言之一.本书共27章,由浅入深.全面系统地介绍了利 ...

  8. SSE技术详解:一种全新的HTML5服务器推送事件技术

    前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...

  9. CDN学习笔记二(技术详解)

    一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精华放上网.公诸同 ...

随机推荐

  1. liunx必知必会(1)

    一.liunx目录结构: (1)/bin中 - 用户二进制文件 包含二进制可执行文件. 在单用户模式下,你需要使用的常见Linux命令都位于此目录下.系统的所有用户使用的命令都设在这里. (2)/sb ...

  2. Docker 入门 第三部分: 服务

    目录 Docker 入门 第三部分: 服务 先决条件 介绍 你的第一个 docker-compose.yml 文件 docker-compose.yml 运行你新建的负载均衡应用 扩展应用程序 卸载应 ...

  3. 异常处理com.sun.image.codec.jpeg.JPEGImageEncoder

    以下方案不一定能解决问题.解决方案:配置JDK的JRE_HOME 环境变量既可. Linux 下配置  : vi /etc/profile 在profile文件下面追加写入下面信息: export J ...

  4. jaxp实现对xml文档的增,删,改,查操作(附源码)浅析

    jaxp,属于javase中的一部分.是对xml进行解析的一个工具类: 既然说到这里,还是讲全一点,讲讲上面说到的xml的解析技术. xml的一个标记型文档. 在html的层级结构中,它会在内存中分配 ...

  5. if语句与switch语句

    if语句可以替代switch语句,但是switch语句不能完全替代if语句.比如下面这种就是不对的 switch (len) { case (len <= 4): domLen = 4; bre ...

  6. WPF开发中的多线程的问题

    今天帮助同事做了一个WPF版的多线程demo,分享给大家. 要实现的问题就是非主线程thread1 去后台不停的取新数据,当有新数据的时候就会展示到前台. 我给他做的demo实现一个按秒的计数器,随着 ...

  7. 【转】Python基础语法

    [转]Python基础语法 学习一门编程语言,通常是学习该语言的以下几个部分的内容: 基础语法:如,变量的声明与调用.基本输出语句.代码块语法.注释等: 数据类型:通常都为 数字.字符串.布尔值.数组 ...

  8. 如何交叉编译 linux kernel 内核

    Compilation We first need to move the config file by running cp arch/arm/configs/bcmrpi_cutdown_defc ...

  9. CrossUI SPA Builder ---- feathers API框架

    CrossUI SPA Builder:   http://www.crossui.com/ 国产?   龙博(JSLINB)AJAX框架? CrossUI SPA Builderenables de ...

  10. 3种shell自动交互的方法【转】

    一.背景 shell脚本在处理自动循环或大的任务方面可节省大量的时间,通过创建一个处理任务的命令清单,使用变量.条件.算术和循环等方法快速创建脚本以完成相应工作,这比在命令行下一个个敲入命令要省时省力 ...