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