繁体   English   中英

LINQ List在where子句中给出空异常

[英]LINQ List gives null exception in where Clause

var q = from p in query
where 
   ((criterias.birthday == p.BirthDay|| criterias.birthday == null))                                
&& ((criterias.marriageDate == null || criterias.marriageDate == p.MarriageDate))                                
&& ((criterias.gender == p.Gender) || (criterias.gender == null))
&& ((criterias.nationalities.Contains(p.Nationality)) || (criterias.nationalities == null))

条件isa类,我存储我的搜索条件。 国籍是一个字符串列表。 当我没有字符串中的项目时,会发生问题。 查询抛出空引用异常。 查询不接受国籍的空值。 我怎样才能解决这个问题?

颠倒顺序,以使空检查出现在查询之前:使用|| ,仅当第一部分的计算结果为false时,才对表达式的第二部分进行计算:

&& ((criterias.nationalities == null) || 
             (criterias.nationalities.Contains(p.Nationality)))

看这些2:

   ((criterias.birthday == p.BirthDay|| criterias.birthday == null))
&& ((criterias.marriageDate == null || criterias.marriageDate == p.MarriageDate))  

我认为结婚日期不会给您带来麻烦,但生日会使用错误的顺序。
在这种情况下,您需要||的“短路评估”属性。 ,将其更改为:

   (criterias.birthday == null || criterias.birthday == p.BirthDay)
&& (criterias.marriageDate == null || criterias.marriageDate == p.MarriageDate)

尝试交换国籍检查的顺序。 在尝试评估包含之前,它应该使null检查短路。

((criterias.nationalities == null) || (criterias.nationalities.Contains(p.Nationality))) 

扭转这句话:

(criterias.nationalities.Contains(p.Nationality)) || (criterias.nationalities == null)

这样它读

(criterias.nationalities == null) || (criterias.nationalities.Contains(p.Nationality))

如果第一个操作数的值为true,则第二个操作数将被跳过。

尝试先检查是否为null,然后尝试检查是否包含:

var q = from p in query 
where     
((criterias.birthday == p.BirthDay|| criterias.birthday == null))                                 
&& ((criterias.marriageDate == null ||  criterias.marriageDate == p.MarriageDate))
&& ((criterias.gender == p.Gender) || (criterias.gender == null)) 
&& ((criterias.nationalities == null) || (criterias.nationalities.Contains(p.Nationality))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM