【问题标题】:C# - Dynamic Linq left outer join on multiple propertiesC# - 多个属性上的动态 Linq 左外连接
【发布时间】: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 你找到解决方案了吗?因为我有完全相同的问题

标签: c# sql linq dynamic-linq


【解决方案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 的好例子。 stackoverflow.com/questions/584820/…
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-08-26
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 2011-08-10
    • 1970-01-01
    • 2010-09-09
    • 2012-01-08
    相关资源
    最近更新 更多