当前位置:  开发笔记 > 编程语言 > 正文

为什么Linq的加入方式不同

如何解决《为什么Linq的加入方式不同》经验,为你挑选了1个好方法。

好吧这是一个小小的呻吟,但这也是一个问题.在Linq我可以这样做一个连接:

from c in dc.Customers join o in dc.Orders on c.custid equals o.custid ...

一切都很好,完全可以记住,而不必回去谷歌.但是由于某些原因,左连接更加复杂:

from c in dc.Customers 
join o in dc.Orders on c.custid equals o.custid 
into temp from x in temp.DefaultIfEmpty() ...

所以我的问题是为什么Linq的设计师不能用这样的东西简单(更像sql):

来自c的dc.Customers在c.custid等于o.custid的dc.Orders中加入了o ...

干杯李



1> Amy B..:

为什么Linq的设计师不能简单(更像sql)

他们可以.但是你对简单(作为sql程序员)的定义与OO程序员对简单的定义不同.Linq(在C#中)首先是面向OO程序员的查询技术.这方面的一个例子是为什么选择最后.这是为了在编辑器中实现C#中的范围规则和智能感知支持.

这些程序员可能没有得到LEFT JOIN(并且如果你说LEFT OUTER JOIN- 并且认为存在一些差异,如同一个继承自另一个),会变得非常困惑.

他们所理解的是GROUP JOIN,其行为方式类似.

List myInts = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List myOtherInts = new List() { 1, 3, 5, 7, 9, 11, 13 };
//
var query = from i in myInts
    join j in myOtherInts on i equals j into g
    select new {key = i, myGroup = g};
//
foreach (var grouping in query)
{
  Console.WriteLine("--{0}", grouping.key);
  foreach (var x in grouping.myGroup)
    Console.WriteLine(x);
}

所有DefaultIfEmpty这些工作都是打开组 - 将结果展平为行/列形式 - 远离OO程序员的自然形式. DefaultIfEmpty在语义上没有必要得到结果.

这是方法形式的相同查询 - 编译器从上面生成并且我更喜欢它:

var query = myInts.GroupJoin(
    myOtherInts,
    i => i,
    j => j,
    (i, g) => new { key = i, myGroup = g }
);

你可以用他的例子来说明吗?

此查询为您的客户提供其订单作为附加集合.订单集合可能为空.如果您有50个客户和1000个订单,则结果中将有50个客户.

from c in dc.Customers
join o in dc.Orders on c.custid equals o.custid into someOrders
select new CustomerWithOrders()
  {theCustomer = c, theOrders = someOrders};

此查询为您提供CustomerOrder行.如果客户有5个订单,则客户将出现5次,每次都与不同的订单匹配.如果客户有0个订单,则客户将出现一次与空订单匹配.如果您有50个客户和1000个订单,则在连接后将有50-1049行,并且结果中的元素含义很难定义.

from c in dc.Customers
join o in dc.Orders on c.custid equals o.custid into temp
from x in temp.DefaultIfEmpty()
select new CustomerOrderHybrid() {theCustomer = c, theOrder = x}

如果它们已实现left join,则需要第二个示例的结果形状.一旦我使用了group join,哪个更好,我也不会left join一步到位.查询结果的分层整形很棒.

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有