C# 在使用条件对空值进行测试后,仍会对其求值

C# 在使用条件对空值进行测试后,仍会对其求值,c#,entity-framework-core,linq-to-entities,entity-framework-core-3.0,C#,Entity Framework Core,Linq To Entities,Entity Framework Core 3.0,我有以下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.A

我有以下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
),而是使用等效的逻辑二进制表达式

e、 g.代替

(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


如果这不起作用,那么代码< >地址> /代码>或代码>国家代码> /COD>属性,可能是实体框架问题。

您的代码要求读者记住所有的C运算符优先级规则。考虑添加更多的括号。也查C代码< >?<代码> >代码>??运算符使用括号可以更改任何内容?(x.Address==null | | user.Address==null)?@Longoon12000不能使用?。在使用实体框架的lambda表达式上不能使用x?.Address?。在lambda表达式上…至少不能使用实体框架