在使用条件测试后仍然评估空值
Null value is still evaluated after testing it with condition
我有以下 LINQ 查询:
houses.Where(x =>
x.A && user.B
||
(x.Address == null || user.Address == null ? false : x.Address.CountryCode == user.Address.CountryCode
))
当 user.Address
为空时出现错误:
user.Address.CountryCode
为了避免这种情况,我尝试使用:
x.Address == null || user.Address == null
不过好像user.Address.CountryCode
还在评价中
我怎样才能避免这种情况?
这绝对是 EF Core 3.0 查询转换器缺陷。
现在(通常)您可以通过不对需要转换为 SQL 查询参数的条件表达式使用条件运算符 ?:
来避免它(例如您的 user.Address.CountryCode
), 而是等效的逻辑二进制表达式。
例如而不是
(x.Address == null || user.Address == null ? false : x.Address.CountryCode == user.Address.CountryCode)
使用等效项
(x.Address != null && user.Address != null && x.Address.CountryCode == user.Address.CountryCode)
我个人觉得这个逻辑很混乱。你可以试试:
( (x?.Address?.CountryCode != null && user?.Address?.CountryCode != null) ? x.Address.CountryCode == user.Address.CountryCode : false
如果这不起作用,那么 Address
或 CountryCode
属性发生了一些非常奇怪的事情!可能和entity framework问题。
我有以下 LINQ 查询:
houses.Where(x =>
x.A && user.B
||
(x.Address == null || user.Address == null ? false : x.Address.CountryCode == user.Address.CountryCode
))
当 user.Address
为空时出现错误:
user.Address.CountryCode
为了避免这种情况,我尝试使用:
x.Address == null || user.Address == null
不过好像user.Address.CountryCode
还在评价中
我怎样才能避免这种情况?
这绝对是 EF Core 3.0 查询转换器缺陷。
现在(通常)您可以通过不对需要转换为 SQL 查询参数的条件表达式使用条件运算符 ?:
来避免它(例如您的 user.Address.CountryCode
), 而是等效的逻辑二进制表达式。
例如而不是
(x.Address == null || user.Address == null ? false : x.Address.CountryCode == user.Address.CountryCode)
使用等效项
(x.Address != null && user.Address != null && x.Address.CountryCode == user.Address.CountryCode)
我个人觉得这个逻辑很混乱。你可以试试:
( (x?.Address?.CountryCode != null && user?.Address?.CountryCode != null) ? x.Address.CountryCode == user.Address.CountryCode : false
如果这不起作用,那么 Address
或 CountryCode
属性发生了一些非常奇怪的事情!可能和entity framework问题。