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

4

我想在动态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代码是什么?

你在这里遇到了什么问题?只是需要语法吗?试试这个文档 - slawekwin
可能是一个LINQ中的LEFT OUTER JOIN的重复问题。 - uTeisT
1
@Oktay - 从动态 LINQ 的文档中看来,它似乎没有 GroupJoin 的重载。 - Gilad Green
slawekwin 是的,我需要语法。 @uteist 不是重复的。你的链接是关于LINQ,但我需要动态LINQ。 - Oktay Myumyunov
1
@OktayMyumyunov,你找到解决方案了吗?因为我也有完全相同的问题。 - Asım Gündüz
你好,你找到解决方案了吗? - Mosta
2个回答

0

0

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

尚未测试,但大致如下:

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 };

通过在表B的连接上执行.DefaultIfEmpty(),它将把它视为左连接。如果省略.DefaultIfEmpty(),则它将像内连接一样运行。

谢谢!我不能使用语句语法,因为我在select()函数中传入的字符串是动态的,并作为参数进入函数。 - Oktay Myumyunov
你不需要返回一个匿名类型,可以使用 select new MyObject { First = col1, 等等 }。或者,如果该函数是一个数据适配器,你可以尝试使用 .Invoke() 选择该函数。 - Joe_DM
这里有一个很好的例子,使用.SelectMany和左连接执行左外连接。https://dev59.com/mXRB5IYBdhLWcg3wkH9N - Joe_DM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接