C# 在使用条件对空值进行测试后,仍会对其求值
我有以下LINQ查询: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
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表达式上…至少不能使用实体框架