我有一个运行代码在。NET核心3.1,但迁移到。NET 6后,我得到这个错误。下划线数据库和数据也是一样的以前。
可为Null的对象必须有值
我有两个独立的linq查询,都返回一个IQueryable<>
。最后,再次加入两个查询,并从数据库中获得结果。
编码:
var query1 = from t1 in Table1
join t2 in Table2 on t1.Id equals t2.Id into join2
from t2 in join2.DefaultIfEmpty()
join t3 in Table3 on t1.Id equals t3.Id into join3
from t3 in join3.DefaultIfEmpty()
join t4 in Table4 on t1.Id equals t4.Id into join4
from t4 in join4.DefaultIfEmpty()
select new { t1, t2, t3, t4 };
var query2 = from t5 in Table5
join t6 in Table6 on t5.Id equals t6.Id into join6
from t6 in join6.DefaultIfEmpty()
join t7 in Table7 on t5.Id equals t7.Id into join7
from t7 in join7.DefaultIfEmpty()
join t8 in Table8 on t5.Id equals t8.Id into join8
from t8 in join8.DefaultIfEmpty()
select new { t5, t6, t7, t8 };
var query3 = from q1 in query1
join q2 in query2 on q1.t1.Id equals q2.t5.Id
select new ResponseObject
{
Field1 = q1.t1.Field1,
Field2 = q1.t2.Field2,
Field3 = q1.t3.Field3,
Field4 = q1.t4.Field4,
Field5 = q2.t5.Field5,
Field6 = q2.t6.Field6,
Field7 = q2.t7.Field7,
Field8 = q2.t8.Field8,
};
// Exception is thrown on this line
var result = query3.ToList();
我知道了原因,因为有时t2/t3/t4和t6/t7/t8可能是空的,当试图访问这些属性时,它会抛出错误。但我想知道在.NET核心版本升级之前这是如何工作的。
在.NET 6 / EF Core 6的突破性更改中没有提到任何内容。那么,如何处理这个问题呢?因为我在代码中的许多地方都有这种查询。
我还尝试在select中使用Null Propagating Operator (?)
,
select new ResponseObject
{
Field3 = q1?.t1?.Field3,
Field4 = q1?.t2?.Field4
.
.
.
};
但这会引发编译时错误
表达式树不能包含空传播运算符
1条答案
按热度按时间2uluyalo1#
用于
表达式树不能包含空传播运算符
IQueryable<>
使用表达式树,因此您可以使用旧方法执行此操作,而无需空值传播。