在Linq中使用Left Outer Join

时间:2015-01-08 07:40:10

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

我想用左外连接编写一个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.'

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

我一直在尝试,但最终没有解决方案。所以,对此的任何帮助都将受到高度赞赏。谢谢提前..

2 个答案:

答案 0 :(得分:3)

您的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 {}语句添加多重连接关系。

答案 1 :(得分:1)

如果集合中没有任何内容,

DefaultIfEmpty将返回包含单个默认项的集合。

由于您的实体可能是类而不是结构,这意味着您会在其中获得一个null的集合,一个集合,其中包含一个带有空字段的单个项目。

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

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