【问题标题】:SQL to Linq Left Join with 'AND' in the SQL Join StatementSQL to Linq 在 SQL Join 语句中使用“AND”左连接
【发布时间】:2012-03-01 18:45:38
【问题描述】:

我有一个运行良好的 SQL 查询,我需要将其转换为 Linq。我需要将所有记录返回一个表并将其连接到第二个表。我需要返回第一个表中的所有结果与第二个表中的结果连接,其中第二个表中特定字段的值等于变量值(在下面的示例中为 75)或返回 null。

所以结果中的总行数应该是 table1 的总行数。来自 table2 的连接中的行部分应该显示 table2 中存在记录的值为 75 的值,或者显示不存在记录的 null。

编辑:我应该提到 t1.field1 是一个 int 而 t2.field1 是一个可为空的 int。

我尝试了多个 linq 语句、对连接进行分组、询问同事以及在谷歌上搜索直到我的眼睛流血。我被困住了。我知道我的问题措辞可能不清楚,如果不是,我提前道歉。

提前致谢。 克里斯

SQL 查询:

SELECT *
FROM table1 AS t1 LEFT OUTER JOIN 
table2 AS t2 ON t1.field1 = t2.field1 AND t2.field2 = 75

【问题讨论】:

  • 请在提问前进行一些搜索。网上有几十个样本。
  • 网上有很多例子。不幸的是,这些对我不起作用。它可能与将 int 与可空 int 或可空 int 与不是表字段的 int 的整数进行比较有关。但相信我,我做了我的研究。

标签: c# linq sql-server-2008


【解决方案1】:

使用DefaultIfEmpty - 请参阅LINQ - Left Join, Group By, and Counthttp://msdn.microsoft.com/en-us/library/bb397895.aspx 了解如何实现此目的的示例

一个有效但不像我预期的那样优雅的答案:

var q = from item1 in table1  
            join item2 in table2 on new { Field1=(int?)item1.Field1, Field2=75 }  
                   equals new { item2.Field1, item2.Field2 } into gj  
            from subItem2 in gj.DefaultIfEmpty()  
            select new { F1= item1.Field1, F2 = ( subItem2 == null ? string.Empty : subItem2.Field2.ToString()) };

我看不到在哪里可以放置 (Field2 = 75) 中的 where 子句,因此我使用表之间的复合键来实现相同的效果。

丑陋的第二位是强制转换为可为空的 int 因为或复合键中的 Field1 所以它可以等同于表 2 上的相应字段。

显然,您以匿名类型返回您感兴趣的任何值。请注意,您不能返回 null,这就是为什么我展示 Field2 的字符串表示,以便您可以看到从第二个表返回的内容。

【讨论】:

  • 感谢您的评论。 DefaultIfEmpty 非常适合进行正常的左/右连接,但是当我需要 table2 为 null 或只有 id 为 75 的行时,它仍然只返回 table2 不为 null 的行。
【解决方案2】:

感谢您的回复。因为我需要一些空值,但只有特定 id 为空的空值,而不是所有空值,所以上述解决方案都不起作用。如果可能的话,在 linq 中执行此操作似乎非常困难。

因此,为了节省时间,我决定采用有效的 SQL 查询并将其转换为存储过程和函数导入。我觉得这可能不是正确的做法,但时间总是一个因素。

再次感谢您的回复。

【讨论】:

    猜你喜欢
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2015-05-27
    • 1970-01-01
    相关资源
    最近更新 更多