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 左外连接的主要内容,如果未能解决你的问题,请参考以下文章