快速业务通道

LINQ学习笔记:查询是怎么执行的

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-03-14

在这里, SelectSequence是一个有编译器生成的类型,其枚举器将逻辑装入迭代方法中.因此, 当你调用一个操作符例如Select或者Where的时候, 你实际上仅仅是实例化了一个包装了输入序列的可枚举类型, 仅此而已.

链式装饰器

连接多个查询操作符可以用来创建一个多层的装饰器. 考虑下面的查询:

   1: IEnumerable<int> query = new int[] { 5, 12, 3 }
   2:   .Where   (n => n < 10)
   3:   .OrderBy (n => n)
   4:   .Select  (n => n * 10);

 

每一个查询操作符实例化了一个新的装饰器,这个装饰器又包装了之前的序列. 当你枚举query的时候, 你是在查询最初的数组, 并让其穿过一个多层的链式装饰器来完成转换.

另外, 延迟执行的一个特性就是如果你使用渐进式的方式组建你的查询, 也可以创建一个完全等同的对象模型:

   1: IEnumerable<int>
   2:   source    = new int[] { 5, 12, 3 },
   3:   filtered  = source   .Where   (n => n < 10),
   4:   sorted    = filtered .OrderBy (n => n),
   5:   query     = sorted   .Select  (n => n * 10);

 

查询是怎么执行的?

这是枚举之前的查询得到的结果:

foreach (int n in query)

Console.Write (n + ","); // 30,50,

在幕后, foreach调用了Select装饰器上的GetEnumberator(最外面的操作符),然后开始触发所有的事件. 结果就是一个链式枚举器结构上对应到一个链式的装饰器序列.

一个查询就是一个生产线的传送带, 我们可以说一个LINQ查询就是一个懒惰的生产线, 传送带和lambda工人根据需求来生产各个元素. 构造一个查询就是在构造一个生产线 – 我们具备了所有的一切条件– 但还没有生产任何的东西. 当消费者请求一个元素的时候(枚举查询结果), 最右边的传送带激活, 然后触发其他的传送带开始生产 –这时需要提供一个输入序列. LINQ使用了一个需求驱动的拉模型, 而不是一个供应驱动的推模型. 这对于LINQ to SQL是非常重要的. 待续!

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号