我正在尝试使用另一个左连接的结果进行左连接但在某些情况下它会返回我的空引用错误(显然),有没有办法在选择后不使用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
};
答案 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