【问题标题】:Left join to a SET using linq使用 linq 左连接到 SET
【发布时间】:2014-05-28 19:19:54
【问题描述】:

在 SQL 中,我通常会内连接两个或多个表以创建一个 set,然后左连接到该 set

select *
from TableA
left outer join
   TableB
   inner join TableC on TableB.Id = TableC.TableBId
on TableA.Id = TableB.TableAId

什么是 Linq 等价物?我使用的是 EF 代码优先。

【问题讨论】:

    标签: linq entity-framework ef-code-first linq-to-entities entity-framework-6


    【解决方案1】:

    像这样:

    var result = from a in TableA
                 join b in TableB on a.Id equals b.TableAId into ab
                 from b in ab.DefaultIfEmpty()
                 join c in TableC on b.Id equals c.TableBId
                 select a;
    

    【讨论】:

    • 该查询中甚至没有左连接。你只是在内心把它们结合在一起。请阅读问题。
    • 这不会抛出空引用异常吗?如果 b 为 null,b.Id 会出错,不是吗?
    • 不会异常
    • 这给出了不正确的结果。我想像我给出的示例一样将连接 A 留在 B 和 C 的内部连接集合中。这会生成内连接 C outside 的左连接的 sql,这实际上使左连接的行为类似于内连接。
    【解决方案2】:

    我能够通过将其分成两个语句来实现这一点。首先,制作您的内连接集,然后左连接到该集。

    var bc = from b in TableB
             join c in TableC on b.Id equals c.TableBId
             select new { B = b, C = c };
    
    var result = from a in TableA
                 from bcRow in bc.Where(row => a.Id equals row.B.TableAId).DefaultIfEmpty()
                 select new { A = a, B = bcRow.B, C = bcRow.C };
    

    【讨论】:

      猜你喜欢
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 2011-08-10
      • 1970-01-01
      相关资源
      最近更新 更多