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 является нулевым, вам потребуется дополнительная проверка

Надеюсь, что это поможет.