簡體   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