LINQ学习笔记:查询是怎么执行的
在这里, 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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |