如何在Lambda LINQ表达式中进行LEFT JOIN

18

如何将此表达式转换为 LEFT JOIN

var query = order.Items.Join(productNonCriticalityList,
    i => i.ProductID,
    p => p.ProductID,
    (i, p) => i);

请注意这是alpha表达式。 - Sergey
http://msdn.microsoft.com/en-us/library/bb397895.aspx - Robert Harvey
2个回答

38

这是使用 Lambda 表达式编写它的更复杂的方法:

order.Items
   .GroupJoin (
      productNonCriticalityList, 
      i => i.ProductID, 
      p => p.ProductID, 
      (i, g) => 
         new  
         {
            i = i, 
            g = g
         }
   )
   .SelectMany (
      temp => temp.g.DefaultIfEmpty(), 
      (temp, p) => 
         new  
         {
            i = temp.i, 
            p = p
         }
   )

我在DefaultIfEmpty()函数中遇到了错误,提示说该函数不存在。我理解我需要在DTO中创建它,对吗? - Dave

13
我建议您切换到使用from语法,并使用into关键字。它与方法语法执行的功能相同,但更易读(依我之见)。
(from l1 in myFirstDataSet
join l2 in mySecondDataSet on l1.<join_val> equals l2.<join_val> into leftJ
from lj in leftJ.DefaultIfEmpty()
where <your_where_clause>
select <something>).ToList();

1
"from...join...into" 在方法语法中只是一个 GroupJoin。使用查询语法并非必须。 - Servy
4
@Sergey 两种不同的表达方式都可以实现相同的功能。没有必要偏爱其中一种。在我看来,对于左连接,这种方式更易读。 - Timeout
是的,我明白这一点,即使VS可以将其从一种风格转换为另一种风格,但问题是我现在没有VS :( - Sergey
请您能否提供一个带有方法样式的示例? - Sergey
@Sergey Magnus在另一篇帖子中提供了一个例子,并指出它“更加复杂”。为了下一个阅读它的人着想,我仍然建议坚持使用“from”语法:D再次强调,它们是相同的东西。 - Timeout
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接