LINQ C#使用Left-Join结果加入

时间:2015-03-05 15:28:34

标签: c# linq join left-join

我正在尝试使用另一个左连接的结果进行左连接但在某些情况下它会返回我的空引用错误(显然),有没有办法在选择后不使用foreach来执行此操作?

var result = from f in foo
             from ex in exp.Where(w => w.id == f.idFoo).DefaultIfEmpty()
             from te in tes.Where(w => w.id == ex.anyID).DefaultIfEmpty()
select new
{
    var1 = f.something,
    ...
    var2 = te.anything
};

2 个答案:

答案 0 :(得分:1)

发生了这种情况,因为DefaultIfEmpty正在返回一个包含null个元素的序列。然后,您尝试访问null元素的属性。

使用the overload of DefaultIfEmpty to return a non-null default value(适当的数据类型):

var result = from f in foo
             from ex in exp.Where(w => w.id == f.idFoo)
                           .DefaultIfEmpty(new Exp())
             from te in tes.Where(w => w.id == ex.anyID)
                           .DefaultIfEmpty(new Tes())
select new
{
    var1 = f.something,
    ...
    var2 = te.anything
};

这样您就不会尝试访问null元素上的属性。

根据评论进行修改。在查询中,null元素出现的一个位置是Where导致零匹配时。例如,在第三个from中,ex变量可能是一个null元素的序列,而select中的te也可能是{{1}}一个序列。在这两种情况下,访问属性都会引发异常。

或者,您可以在每次访问属性时执行空测试。这将变得冗长。

答案 1 :(得分:0)

这样的事情:

var2 = te != null ? te.anything : null