快速业务通道

LINQ学习笔记:Join和Group Join

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-03-13
   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 =

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号