【问题标题】:How to use null in join condition in linq如何在 linq 的连接条件中使用 null
【发布时间】:2014-10-08 15:24:46
【问题描述】:

我无法将此 SQL 语句转换为 linq 查询。我还没有找到一种方法如何在 JOIN 条件中使用 null 和 OR。 这是示例 SQL 语句:

SELECT a.* FROM TableA a JOIN TableB b ON (a.Id = b.Id) OR a.Id IS NULL

什么是等效的 linq 语句?我正在寻找与上述 SQL 语句中的连接条件相同的连接条件。

from a in TableA join b in TableB on ??? equals ??? select a;

我已经搜索了一篇现有的帖子,但显然找不到关于这个特定问题的帖子。 谢谢。

【问题讨论】:

    标签: sql .net linq


    【解决方案1】:

    joins 非常挑剔,因此您只能将它们用于非常具体的事情。但是,使用嵌套的 from 语句很容易得到相同的结果:

    from a in TableA 
    from b in TableB 
    where a.Id == b.Id or a.Id == null
    select a;
    

    此外,根据您真正要查找的数据,这可能是更合适的查询:

    from a in TableA 
    where a.Id == null || TableB.Any(b => b.Id == a.Id)
    select a;
    

    【讨论】:

    • 谢谢。有效。但是,我还需要在投影中选择一个 col 形式的 TableB,因此必须将“from b in TableB”添加到查询中。由于两个表都很小,因此交叉连接在这种情况下影响不大。我想知道这两个表是否都很大,这个交叉连接将如何执行。我在想有一种方法可以在 join 子句中使用这样的条件。
    • @KhaliqueRehman:我猜这不会有太大的不同。事实上,我敢打赌,使用from...from...where... 的查询执行计划与使用from...join...on... 的查询执行计划完全相同。顺便说一句,您是否期望表 B 中的多个条目与表 A 中的给定条目匹配,或者它是一对(零对一)关系?另外,您的 LINQ 提供程序是否为您提供导航属性 (a.TableB)?
    • 是的,当表 A 具有匹配 col 的空值时,我期望表 B 中的所有记录。我本可以通过创建多对多关系来解决数据库中的这种情况,但没有这样做。稍后我会比较这两者在 SQL 中是如何翻译的。是的,我可以使用 a.TableB;但我认为它会创建一个隐式的内部连接。
    猜你喜欢
    • 2010-11-29
    • 1970-01-01
    • 2016-08-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多