0
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)) 

標準是一個類,我存儲我的搜索標準。國籍是一個字符串列表。當我在字符串中沒有項目時會發生問題。該查詢會引發空引用異常。該查詢在國籍中不接受空值。我怎樣才能解決這個問題?使空校驗來查詢之前LINQ列表給出了空例外條款

+0

你使用'()'不是很一致。 – 2011-06-16 11:57:57

回答

2

顛倒順序:如你使用||,表達的第二部分只計算在第一部分的計算結果爲假:

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

試換國籍檢查的順序。在嘗試評估Contains之前,它應該在空檢查上短路。

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

打開這個說法周圍:

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

以便讀取

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

如果第一個操作數的計算結果爲真,第二個將被跳過。

2

看着這些2:

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

我不認爲marriageDate會給你的問題,但生日使用錯誤的順序。
在這種情況下,你需要的||的「短路計算」屬性,將其更改爲:

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

嘗試使用無效首先檢查,然後(如果不爲空),檢查包括:

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)) 
+0

我改變了空檢查的順序幷包含。而且我也將「null」方面改爲「」criterias.nationalities.count == 0「」。然後它工作。感謝幫助 – 2011-06-17 10:50:33