【问题标题】:How to make LEFT JOIN in Lambda LINQ expressions如何在 Lambda LINQ 表达式中进行 LEFT JOIN
【发布时间】:2017-05-30 20:50:28
【问题描述】:

如何使这个表达式为 LEFT JOIN

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

【问题讨论】:

标签: c# linq entity-framework


【解决方案1】:

这是使用 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 中创建对吗?
【解决方案2】:

我建议切换到from 语法,您可以使用into 关键字。

它与方法语法的作用相同,而且可读性更高 (IMO)。

(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();

【讨论】:

  • from...join...into 只是方法语法中的GroupJoin。使用查询语法不是必需
  • @Sergey 这两种不同风格的表达方式做同样的事情。没有必要偏袒一个。对于左连接,这在 imo 中更具可读性。
  • 是的,这对我来说很清楚,即使 VS 可以将其从一种样式转换为另一种样式,但问题是我现在没有 VS :(
  • 能否提供一个方法样式的示例?
  • @Sergey Magnus 在另一篇文章中提供了一个示例,并指出它“更复杂”。为了下一个必须阅读它的人,我仍然建议坚持使用“from”语法:D 同样,它们是相同的。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 2020-11-30
相关资源
最近更新 更多