Linq где clause и count result имеют нулевое исключение
Приведенный ниже код работает, если p.School.SchoolName оказывается равным null, и в этом случае это приводит к исключению NullReferenceException.
if (ExistingUsers.Where(p => p.StudentID == item.StaffID &&
p.School.SchoolName == item.SchoolID).Count() > 0)
{
// Do stuff.
}
ExistingUsers - это список пользователей:
public List<User> ExistingUsers;
Вот соответствующая часть stacktrace:
System.NullReferenceException: ссылка на объект не установлена в экземпляр объекта.
в System.Linq.Enumerable.WhereListIterator 1.MoveNext()
at System.Linq.Enumerable.Count[TSource](IEnumerable
1 источник)
Как мне обрабатывать это предложение where?
Спасибо очень заблаговременно.
Ответы
Ответ 1
Я подозреваю, что p.School
имеет значение null, а не SchoolName
. Просто добавьте нулевую проверку перед доступом к SchoolName
. Кроме того, используйте Any()
, чтобы проверить, есть ли какие-либо результаты вместо Count() > 0
, если вы действительно не нуждаетесь в счете. Это работает лучше, поскольку не все элементы повторяются, если они существуют.
var result = ExistingUsers.Where(p => p.StudentID == item.StaffID
&& p.School != null
&& p.School.SchoolName == item.SchoolID)
.Any();
if (result) { /* do something */ }
Ответ 2
Для всех столбцов с нулевым значением базы данных мы должны либо добавить нулевую проверку, либо выполнить простое сравнение a == b
вместо a.ToLower() == b.ToLower()
или подобных строковых операций.
Мои наблюдения, как показано ниже:
По мере того, как они повторяются через Enumerable of LINQ Query для сравнения с входной строкой/значением, любое значение null (столбца базы данных) и операции над ним будут вызывать исключение, но Enumerable становится NULL, хотя запрос не является нулевым.
Ответ 3
В случае, если вы хотите получить нулевое значение (все ученики, со школьной или нет) Используйте левое соединение.
В MSDN есть хороший пример
Ответ 4
Если я правильно помню (не на моем компьютере разработчика на данный момент и не могу проверить Reflector), использование оператора ==
приводит к вызову реализация экземпляра string.Equals(string)
, а не статическая реализация String.Equals(string, string)
.
Предполагая, что ваша проблема связана с тем, что SchoolName
имеет значение null, как вы предлагаете, попробуйте следующее:
if (ExistingUsers.Where(
p => p.StudentID == item.StaffID
&& String.Equals( p.School.SchoolName, item.SchoolID)).Count() > 0)
{
// Do stuff.
}
Конечно, комментарии других ответов также учитываются:
- Использование
Any()
вместо Count() > 0
будет работать лучше
- Если
p.School
является нулевым, вам потребуется дополнительная проверка
Надеюсь, что это поможет.