【问题标题】:Left outer join using LINQ - yields different outputs使用 LINQ 的左外连接 - 产生不同的输出
【发布时间】:2023-03-28 17:46:01
【问题描述】:

我正在尝试使用 LINQ 编写左外连接。 SQL 看起来像,

SELECT  *                 
FROM Table1 td1
LEFT OUTER JOIN Table2
ON td1.ColumnName = td2.ColumnName
WHERE td2.ColumnName IS NULL                  
ORDER BY SomeColumns

如果我在 SQL 查询分析器中运行此查询,它会返回 100 条记录。我转换后的 LINQ 代码返回 105 条记录。 我用 2 种方式编写 LINQ,

方法一:

var data= (from td1in Table1
           join td2 in Table2.Where(a => a.ColumnName == (int?)null)
           on td1.ColumnName equals td2.ColumnName into outer
           from x in outer.DefaultIfEmpty()
           orderby SomeColumns
           select td1);

方法2:这给出了一个异常,未能枚举结果

var data = from td1 in Table1
           join td2 in Table2
           on td1.ColumnName equals td2.ColumnName into outer
           from item in outer.DefaultIfEmpty()
           where item.ColumnName.Value == (int?)null
           orderby somecolumns
           select td1 ;

where子句中使用的列是可为空的int类型

SQL 分析器返回的结果似乎是正确的。 请帮助我获得相同的结果。

谢谢

【问题讨论】:

    标签: c# linq-to-sql left-join outer-join


    【解决方案1】:

    试试这个查询:

    var data = from td1 in Table1
               join td2 in Table2
               on td1.ColumnName equals td2.ColumnName into outer
               from item in outer.DefaultIfEmpty()
               where item == null
               orderby somecolumns
               select td1 ;
    

    在您的原始查询中,item.ColumnName.Value == (int?)null 行是错误的,因为您尝试检索所有 ColumnName 的值,即使 item 为空。我更正了它,现在它应该可以正常工作了。

    【讨论】:

    • 它抛出一个异常,因为“data.ToList()”抛出了一个“System.NullReferenceException”类型的异常 System.Collections.Generic.List {System.NullReferenceException}
    • 我的错误,已修复,请重试:)
    猜你喜欢
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2011-08-04
    • 2011-03-25
    相关资源
    最近更新 更多