Список LINQ дает нулевое исключение, где пункт

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

критерии — это класс, в котором я храню свои критерии поиска. национальности — строковый список. проблема возникает, когда у меня нет элементов в строке. запрос выдает исключение нулевой ссылки. запрос не принимает нулевое значение в национальностях. Как я могу это исправить?


person Rahman Kalınbaçoğlu    schedule 16.06.2011    source источник
comment
Вы используете ( ) не очень последовательно.   -  person Henk Holterman    schedule 16.06.2011


Ответы (5)


Измените порядок так, чтобы проверка нуля выполнялась перед запросом: поскольку вы используете ||, вторая часть выражения оценивается только тогда, когда первая часть оценивается как ложная:

&& ((criterias.nationalities == null) || 
             (criterias.nationalities.Contains(p.Nationality)))
person stuartd    schedule 16.06.2011

Посмотрите на эти 2:

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

Я не думаю, что замужествоDate вызовет у вас проблемы, но в днях рождения используется неправильный порядок.
В этом случае вам нужно свойство "краткой оценки" для ||, измените его на:

   (criterias.birthday == null || criterias.birthday == p.BirthDay)
&& (criterias.marriageDate == null || criterias.marriageDate == p.MarriageDate)
person Henk Holterman    schedule 16.06.2011

Попробуйте поменять порядок проверки национальности. Он должен замкнуться на нулевой проверке, прежде чем попытается оценить содержимое.

((criterias.nationalities == null) || (criterias.nationalities.Contains(p.Nationality))) 
person Wonko the Sane    schedule 16.06.2011

Переверните это утверждение:

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

чтобы он читал

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

Если первый операнд оценивается как истина, второй будет пропущен.

person Dennis Traub    schedule 16.06.2011

Попробуйте сначала проверить значение null, а затем (если оно не равно 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))
person daniel.herken    schedule 16.06.2011
comment
Я изменил порядок нулевой проверки и содержит. И я также изменил нулевую сторону как критерии.nationalities.count == 0. Тогда это сработало. Спасибо за помощь - person Rahman Kalınbaçoğlu; 17.06.2011