快速业务通道

LINQ学习笔记:Join和Group Join

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-03-13
e当中的实现预加载了内联集合(purchases)到一个有键的字典中

Join执行一个内连接操作, 这意味着那些没有采购订单的客户将被排除在输出结果之外. 使用inner join, 你可以将inner和outer序列互换, 并且仍然可以得到同样的结果:

   1: from p in purchases
   2:  
   3:    join c in customers on p.CustomerID equals c.ID

 

我们可以增加更多的join语句到相同的查询中, 例如, 假设每个采购订单包含一或多个的采购明细, 我们可以像下面这样将他们连接在一起:

   1: from c in customers
   2:  
   3: join p in purchases on c.ID equals p.CustomerID
   4:  
   5: join pi in purchaseItems on p.ID equals pi.PurchaseID

 

Purchases在第一个连接中扮演了inner序列, 而在第二个连接中则扮演了outer序列的角色, 我们可以使用嵌套foreach得到相同的结果, 但是效率不高:

   1: foreach (Customer c in customers)
   2:  
   3:   foreach (Purchase p in purchases)
   4:  
   5:     if (c.ID == p.CustomerID)
   6:  
   7:       foreach (PurchaseItem pi in purchaseItems)
   8:  
   9:         if (p.ID == pi.PurchaseID)
  10:  
  11:           Console.WriteLine (c.Name + “,” + p.Price +
  12:  
  13:                                       “,” + pi.Detail);

 

多主键连接

我们可以使用匿名类型来进行多主键链接操作:

   1: from x in seqX
   2:  
   3: join y in seqY on new { K1 = x.Prop1, K2 = x.Prop2 }
   4:  
   5:            equals new { K1 = y.Prop3, K2 = y.Prop4 }

 

为了能够运行这个查询, 两个匿名类型的结构必须是相同的. 编译器会将它们实现为相同的内部类型, 因此多主键链接能够运行.

Lambda方式的连接

以下的示例使用了复合查询语法:

   1: from c in customers
   2:  
   3: join p in purchases on c.ID equals p.CustomerID
   4:  
   5: select new { c.Name, p.Description, p.Price };

 

使用Lambda表达式的话则可以改成这样:

   1: customers.Join (                // outer collection
   2:  
   3:              purchases,                // inner collection
   4:  
   5:              c => c.ID,                // outer key selector
   6:  
   7:              p => p.CustomerID,        // inner key selector
   8:  
   9:              (c, p) => new             // result selector
  10:  
  11:                 { c.Name, p.Description, p.Price }
  12:  
  13:        );

 

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