- Rongsen.Com.Cn 版权所有 2008-2010 京ICP备08007000号 京公海网安备11010802026356号 朝阳网安编号:110105199号
- 北京黑客防线网安工作室-黑客防线网安服务器维护基地为您提供专业的
服务器维护
,企业网站维护
,网站维护
服务 - (建议采用1024×768分辨率,以达到最佳视觉效果) Powered by 黑客防线网安 ©2009-2010 www.rongsen.com.cn
作者:黑客防线网安SQL维护基地 来源:黑客防线网安SQL维护基地 浏览次数:0 |
连接和Lookups
Enumerable当中的Join和GroupJoin使用两个步骤来工作. 首先, 它们将inner序列加载到一个lookup当中, 然后再将一个outer序列和这个lookup组合在一起.
一个lookup是一个分组序列, 并且可以通过键直接访问, 或者你可以认为它是一个序列字典, 每一个键可以接受多个元素. 并且lookup是只读的, 定以如下:
1: public interface ILookup : 2: 3: IEnumerable>, IEnumerable 4: 5: { 6: 7: int Count { get; } 8: 9: bool Contains (TKey key); 10: 11: IEnumerable this [TKey key] { get; } 12: 13: }
当处理本地集合的时候, 我们可以使用joining操作符作为一个额外的可选策略来手工创建或者查询lookups, 这允许你在多个查询上面重用相同的lookup.
ToLookup扩展方法创建了一个lookup. 以下的例子将所有的purchases加载到一个lookup当中去, 它们的关键是CustomerID字段.
1: ILookup<int?,Purchase> purchLookup = 2: 3: purchases. ToLookup (p => p.CustomerID, p => p);
第一个参数选择了键, 第二个参数选取那些作为值被加载到lookup的对象.
读取一个lookup就像在读取一个字典, 除非indexer返回了包含匹配项的序列, 而不是简单的匹配. 以下的例子枚举了ID是1的客户采购订单:
1: foreach (Purchase p in purchLookup [1]) 2: 3: Console.WriteLine (p.Description);
在适当的位置使用lookup, 我们可以让SelectMany / Select查询执行得跟Join / GroupJoin一样有效率. 在一个lookup上面使用SelectMany与Join是等价的:
1: from c in customers 2: 3: from p in purchLookup [c.ID] 4: 5: select new { c.Name, p.Description, p.Price }; 6: 7: Tom Bike 500 8: 9: Tom Holiday 2000 10: 11: Dick Bike 600 12: 13: Dick Phone 300 14: ...
增加一个DefaultIfEmpty的调用可以让此查询变成一个Outer Join:
1: from c in customers 2: 3: from p in purchLookup [c.ID].DefaultIfEmpty() 4: 5: select new 6: 7: { 8: 9: c.Name, 10: 11: Descript = p == null ? null :p.Description, 12: 13: Price = p == null ? (decimal?) null :p.Price 14: 15: };
在projection内读lookup与GroupJoin是等价的:
1: from c in customers 2: 3: select new { 4: 5: CustName = c.Name, 6: 7: CustPurchases = purchLookup [c.ID] 8: 9: };
待续!
我要申请本站:N点 | 黑客防线官网 | |
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479 |