У нас сегодня была ошибка Nullable object must have a value
в этой строке кода:
list = From x In Me Where x.FooDate.HasValue AndAlso x.FooDate.Value.Date >= barDate
Забавно то, что я уверен, что раньше это работало нормально (и в базовых данных всегда было небольшое количество нулевых значений). И по логике это выглядит хорошо для меня. Чек на HasValue
и AndAlso
выглядят как будто они собираются защитить нас от любой нулевой опасности.
Но, кажется, вдруг это не так. Я что-то упустил?
ОК, мы можем исправить это, что устраняет ошибку:
list = From x In Me Where If(x.FooDate.HasValue, x.FooDate.Value.Date >= barDate,False)
Но это выглядит для меня менее читабельным. Есть мысли?
Обновление ... и Исповедь :
Упрощая приведенный выше код для сокращения строки, я упустил важный кусок кода. Исходная задача должна была выглядеть примерно так:
list = From x In Me Where x.FooDate.HasValue AndAlso x.FooDate.Value.Date >= fromDate And x.FooDate.Value.Date <= toDate
Из-за правил короткого замыкания и приоритета операторов (как указано в ответе на мой давний вопрос) мне нужно было добавить скобки вокруг второй части инструкции, чтобы остановить LINQ. оценивая второй x.FooDate.Value.Date
:
list = From x In Me Where x.FooDate.HasValue AndAlso (x.FooDate.Value.Date >= fromDate and x.FooDate.Value.Date <= toDate)
Благодаря обоим ответам за создание кода быстрого теста, чтобы убедиться, что LINQ действительно подчиняется AndAlso, и вынудить меня более внимательно изучить исходную проблему.