C# - 多个属性上的动态 Linq 左外连接

Posted

技术标签:

【中文标题】C# - 多个属性上的动态 Linq 左外连接【英文标题】:C# - Dynamic Linq left outer join on multiple properties 【发布时间】:2017-01-01 21:10:40 【问题描述】:

我想在 Dynamic Linq 中进行左外连接,但我无法正确使用语法。在 SQL 中,它看起来像这样:

SELECT col1, col2, col3 from tableA as a
LEFT OUTER JOIN tableB as b on a.col1 = b.col1 AND a.col2 = b.col2 AND a.col3 = 1

在动态 linq 中我试过这个:

dbContext.tableA
.GroupJoin(tableB, col1 == tableA.col1 && col2 == tableA.col2 && col3 == 1)
.Select('new(col1, col2, col3)');

第三个连接参数(列)只是硬编码的,因为它不是来自 tableB。 什么是正确的 linq 代码?

编辑:这不是一个重复的问题。我正在寻找适用于动态 LINQ 而非普通 linq 的语法

【问题讨论】:

您在这里遇到什么问题?它只是您需要的语法吗?试试documentation LEFT OUTER JOIN in LINQ的可能重复 @Oktay - 从动态 linq 的文档来看,它们似乎没有 GroupJoin 重载 - slawekwin 是的,我需要语法。 @uteist 不是重复的。您的链接指向 LINQ,我需要动态 LINQ。 @OktayMyumyunov 你找到解决方案了吗?因为我有完全相同的问题 【参考方案1】:

通常对于连接,尤其是左连接,我使用语句语法。

未经测试,但看起来像这样:

var result = from a in tableA
             from b in tableB.Where(x => x.col1 == a.col1 && x.col2 == a.col2 && a.col3 == 1).DefaultIfEmpty()
             select new  a.col1, a.col2, b.col3 ;

通过对来自 tableB 的连接执行 .DefaultIfEmpty(),它会将其视为左连接。如果你省略 .DefaultIfEmpty() 那么它的行为就像一个内部连接。

【讨论】:

谢谢!我不能使用语句语法,因为我传入 select() 的字符串是动态的,并且作为参数进入函数。 你不需要返回匿名类型,你可以做一个 select new MyObject First = col1, etc 或者,我没有尝试过,但如果函数是一个数据适配器你可以尝试使用 .Invoke() 选择函数 这里看起来像是一个带有左连接的 .SelectMany 的好例子。 ***.com/questions/584820/…【参考方案2】:

您可以在 GitHub 上找到有助于使用 Dynamic Linq 进行左连接的扩展:https://github.com/SikeyMael/LinqHelper

【讨论】:

以上是关于C# - 多个属性上的动态 Linq 左外连接的主要内容,如果未能解决你的问题,请参考以下文章

LINQ:具有多个条件的左外连接

Linq to Sql:多个左外连接

Linq表达式多个左外连接错误

Linq to Entity 具有多个左外连接

使用左外连接的多个字段的 LINQ 连接查询

如何使用 Dynamic Linq 进行左外连接?