什么是基于方法的语法等效于join into

时间:2014-02-27 06:55:38

标签: linq

found以下linq表达式,我想知道into关键字在基于方法的语法中是如何转换的?

var q = from pd in dataContext.tblProducts 
        join od in dataContext.tblOrders on pd.ProductID equals od.ProductID 
        into t 
        from rt in t.DefaultIfEmpty() 
        orderby pd.ProductID 
        select pd

2 个答案:

答案 0 :(得分:2)

所有这些转换都在C#规范中描述。 7.16.2查询表达式翻译是关于C#的那一部分。

根据该规范,join有两个案例into

  

带有join子句且into后跟a的查询表达式   select条款

from x1 in e1
join x2 in e2 on k1 equals k2 into g
select v
     

被翻译成

( e1 ) . GroupJoin( e2 , x1 => k1 , x2 => k2 , ( x1 , g ) => v )
     

带有join子句且后跟into的查询表达式   除select子句

之外的其他内容
from x1 in e1
join x2 in e2 on k1 equals k2 into g
…
     

被翻译成

from * in ( e1 ) . GroupJoin(
  e2 , x1 => k1 , x2 => k2 , ( x1 , g ) => new { x1 , g })
…

答案 1 :(得分:1)

根据this post @GertArnoldgroup ... into linq查询语法使用了GroupJoin()方法:

var q1 = from pd in dataContext.tblProducts 
        join od in dataContext.tblOrders on pd.ProductID equals od.ProductID 
        into t
        select t;

var q2 = dataContext.tblProducts
                    .GroupJoin(dataContext.tblOrders
                                , pd => pd.ProductID
                                , od => od.ProductID
                                , (pd, ods) => select new 
                                                    {
                                                        Product = pd,
                                                        Orders = ods
                                                    });

上面的示例中的两个表达式都以类似的方式进行分组操作,尽管返回值不同。