用于在不同表上具有多个 LEFT OUTER JOINS 的 SQL 的 LINQ

Posted

技术标签:

【中文标题】用于在不同表上具有多个 LEFT OUTER JOINS 的 SQL 的 LINQ【英文标题】:LINQ for an SQL with multiple LEFT OUTER JOINS on different tables 【发布时间】:2020-01-16 20:05:54 【问题描述】:

我正在尝试创建一个包含 LEFT 外连接的 LINQ 查询。有一些例子,但我有一些不同的场景

Select * from A_TABLE
LEFT OUTER JOIN B_TABLE ON A_TABLE.Id = B_TABLE.A_TABLE_Id
LEFT OUTER JOIN C_TABLE ON B_TABLE.Id = C_TABLE.B_TABLE_Id

第二个连接不在 A_TABLE 它是 B_TABLE 和 C_TABLE

我们可以将其转换为 LINQ 吗?

【问题讨论】:

【参考方案1】:

您可以像这样简单地将查询转换为 linq 查询:

var results = (from a in A_TABLE
               join b in B_TABLE
               on a.A_TABLE_Id equals b.A_TABLE_Id into ab
               from b in ab.DefaultIfEmpty()
               join c in C_TABLE_List on b.B_TABLE_Id equals c.B_TABLE_Id

               select new
                   
                     ClassAProperty1 = a.Property1,
                     ClassBProperty1 = b.Property1,
                     ClassCProperty1 = c.Property1
                   ).ToList();

您可以随时继续加入表格。

不要忘记将 Property# 更改为所需的属性名称。

如需了解更多信息,请查看LINQ Left Outer Join 和this stack thread。

更新: 这是查询的 Lambda 表达式版本:

var result = A_TABLE
             .GroupJoin(B_TABLE,
                 a => a.A_TABLE_Id,
                 b => b.A_TABLE_Id,
                 (a, b) =>
                 new 
                       tableAProperty1 = a.Property1,
                       tableAProperty2 = a.Property2, /* You cannot access this property in next join if you don't add it here */
                       B_TABLE = b.FirstOrDefault() /* This is the way to access B_TABLE in next join */
                 ).GroupJoin(C_TABLE,
                       ab => ab.B_TABLE.B_TABLE_Id,
                       c => c.B_TABLE_Id,
                       (ab, c) =>
                       new 
                             ab.tableAProperty1,
                             B_TABLEProperty2 = ab.B_TABLE.Property2,
                             C_TABLE = c.FirstOrDefault()
                            ).ToList();

【讨论】:

非常感谢..我可以输入 lambda 表达式吗? bb => bb.b.Id 未编译。 bb.b 是一个可枚举的集合。 很抱歉看到这个问题太晚了。我已经编辑了两个代码 sn-ps。

以上是关于用于在不同表上具有多个 LEFT OUTER JOINS 的 SQL 的 LINQ的主要内容,如果未能解决你的问题,请参考以下文章

多个左连接 - 啥是“左”表?

多个表上的多个 FULL OUTER JOIN

用于 XML 的 C# LINQ Left Outer Join 无法正常工作

sqlite LEFT OUTER JOIN 多个表

LEFT OUTER JOIN 不能在没有连接两边的字段相等的条件下使用

带有子查询语法的 LEFT OUTER JOIN