在 Linq 中使用左外连接

Posted

技术标签:

【中文标题】在 Linq 中使用左外连接【英文标题】:Using Left Outer Join in Linq 【发布时间】:2015-03-06 06:35:03 【问题描述】:

我想编写一个带有左外连接的LINQ 查询。为此,我可以编写相应的SQL 查询,它返回所需的输出,但在 linq 中同样的结果对我不起作用。

这就是我的 SQL 的样子:

  SELECT Table1.ID, Table1.Description
  FROM Table1 LEFT OUTER JOIN
  Table2 ON Table1.AID = Table2.AID AND Table1.TID = Table2.TID
  WHERE (Table2.Status <> 'Using') OR (Table.Status IS NULL) 

此查询为我返回 7 条记录,这就是我的要求。现在我想用 LINQ 编写相同的查询,这是我尝试过的:

  return (from t1 in db.Table1.AsEnumerable()
    join t2 in db.Table2.AsEnumerable() on t1.AID equals t2.AID into outer
    from item in outer.DefaultIfEmpty()
    where item.TID == t1.TID
    && string.IsNullOrEmpty(item.Status) || item.Status != "Using"
    select t1
     );

但我一直面临这个问题。在这里,它无法找到项目并因此返回

'Object reference not set to an instance of an object.'

我在这里做错了什么????

我一直在尝试,但最终没有解决方案。因此,我们将不胜感激。在此先感谢..

【问题讨论】:

What is a NullReferenceException and how do I fix it? 你为什么有这个AsEnumerable()?您应该可以将其删除。 (两次) 【参考方案1】:

你的 SQL 和 LINQ 语句不一样,你有一个不同的 join 子句。 试试这个:

from t1 in db.Table1
    join t2 in db.Table2 on new  
                                aID = t1.AID, 
                                tID = t2.TID 
                                 
                         equals new  
                                aID = t2.AID, 
                                tID = t2.TID 
                                 into outer
    from item in outer.DefaultIfEmpty()
    where item.Status == null || item.Status != "Using"
    select t1

您可以使用new equals new 语句添加多重连接关系。

【讨论】:

试过了,但在item.Status 部分再次出现同样的错误。调试时,该字段的值显示为空。请检查一下。 感谢您的帮助。删除 AsEnumerable 后使用相同的 where 条件。【参考方案2】:

DefaultIfEmpty 如果集合中没有任何内容,则返回一个包含单个默认项的集合。

由于您的实体可能是类而不是结构,这意味着您将获得一个包含单个 null 的集合,不是一个包含单个项目且包含空字段的集合。 p>

除了将连接子句更改为suggested by Loetn,您还应该将where 条件更改为

where item == null || item.Status != "Using"

【讨论】:

感谢您的帮助。删除 AsEnumerable 后使用相同的 where 条件。 @Saroj 那是因为使用 AsEnumerable 你正在使用 LINQ-to-Objects,读取空引用的属性会导致异常,而没有 AsEnumerable 你是使用 LINQ-to-SQL,SQL 不在乎。

以上是关于在 Linq 中使用左外连接的主要内容,如果未能解决你的问题,请参考以下文章

LINQ查询中的左外连接[重复]

如何在 Linq 中执行左外连接? [复制]

Linq to Sql:多个左外连接

如何使用 Dynamic Linq 进行左外连接?

Linq左外连接 多字段连接

使用扩展方法/查询语法在 LINQ 中需要左外连接