2013-03-14 151 views
3

我正在嘗試編寫高級搜索的表達式。但是,我需要檢查每個屬性是否爲null,否則會引發錯誤。在lambda表達式中檢查null - linq

我已經在下面包含了沒有空檢查的表達式。

結果是使用jQuery dataTables輸出的。

filteredPeople = unitOfWork.PeopleRepository.Get().Where(c => 
    IdSearchable && c.personID.ToString().Contains(param.sSearch.ToLower()) 
    || surnameSearchable && c.Surname.ToLower().Contains(param.sSearch.ToLower()) 
    || firstNameSearchable && c.FirstName.ToLower().Contains(param.sSearch.ToLower()) 
    || genderSearchable && c.Gender.ToLower().Contains(param.sSearch.ToLower()) 
)); 
+3

那麼你有什麼試圖檢查空? (並且考慮到&&和||的組合,我已經明確地開始將它們括起來......) – 2013-03-14 10:30:28

+0

你的意思是檢查哪些屬性,如果它們爲空,你會做什麼?請注意'c.Surname'等可能會由ORM通過SQL來處理,所以實際上並未在C#代碼中進行測試。或者這是所有的LINQ到對象? – 2013-03-14 10:30:40

+0

@ jc99觀察:由於您來這裏尋求幫助,因此您有必要回答詢問必要的上下文以提供*正確信息的問題 – 2013-03-14 10:58:15

回答

6

請嘗試下面的內容,我基本上將所有的個人條件檢查都包含在括號內,以進一步幫助提高可讀性,並確保您沒有得到任何奇怪的結果,編譯器對該邏輯進行編譯器解釋。

filteredPeople = unitOfWork.PeopleRepository.Get() 
       .Where(c => (IdSearchable 
         && c.personID != null 
         && c.personID.ToString().Contains(param.sSearch.ToLower())) 
        || (surnameSearchable 
         && c.Surname != null 
         && c.Surname.ToLower().Contains(param.sSearch.ToLower())) 
        || (firstNameSearchable 
         && c.FirstName != null 
         && c.FirstName.ToLower().Contains(param.sSearch.ToLower())) 
        || (genderSearchable 
         && c.Gender != null 
         && c.Gender.ToLower().Contains(param.sSearch.ToLower()))); 
1

嘗試這種情況:

filteredPeople = unitOfWork.PeopleRepository.Get() 
       .Where(c => (IdSearchable 
        && c.personID != null 
        && c.personID.ToString().Contains(param.sSearch.ToLower())) 
        || 
        .... 

MSDN

有條件-AND運算符(& &)進行邏輯與的其布爾操作數,但僅評估其第二個操作數如有必要。

+0

個人而言,我期望這個PeopleRepository.Get()是使用某種ORM工具,在這種情況下,這實際上並不會像.NET *那樣執行*反正*;我不知道這是否只是一個測試模擬的問題 – 2013-03-14 10:34:36