LINQ List дает нулевое исключение в где Clause - PullRequest
0 голосов
/ 16 июня 2011
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))

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

Ответы [ 5 ]

2 голосов
/ 16 июня 2011

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

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

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

   (criterias.birthday == null || criterias.birthday == p.BirthDay)
&& (criterias.marriageDate == null || criterias.marriageDate == p.MarriageDate)
2 голосов
/ 16 июня 2011

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

&& ((criterias.nationalities == null) || 
             (criterias.nationalities.Contains(p.Nationality)))
1 голос
/ 16 июня 2011

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

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

так что читается

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

Если первый операнд имеет значение true, второй будет пропущен.

1 голос
/ 16 июня 2011

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

((criterias.nationalities == null) || (criterias.nationalities.Contains(p.Nationality))) 
0 голосов
/ 16 июня 2011

Попробуйте сначала проверить наличие нуля, а затем (если оно не равно нулю) проверить наличие:

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