Вы можете попробовать:
var items = db.Items.Where( x => !x.CategoryId.HasValue );
Проблема с первым примером заключается в том, что LINQ не смотрит на значение переменной при построении выражения. Он просто видит и равенство выражений и преобразует его в эквивалентные выражения в SQL. LINQ требует, чтобы разработчик знал и понимал, как он работает в отношении проверки на нулевые значения. Я думаю, что я дал вам самый простой способ сделать это.
Редактировать : на основе вашего комментария. Вы можете создавать альтернативные запросы, если вы ищете совпадения с categoryId или нулевым идентификатором категории, если categoryId не имеет значения. Это было бы одним из способов объединения множества потенциальных запросов - и, возможно, игнорирования некоторых сравнений, которые вам не нужны в определенной ситуации.
IQueryable<Item> items = db.Items;
if (categoryId.HasValue)
{
items = items.Where( x => x.CategoryId == categoryId );
}
else
{
items = items.Where( x => !x.CategoryId.HasValue );
}
В качестве альтернативы (для вашего простого случая) использование object.Equals
, похоже, заставляет конструктор выражений LINQ to SQL реализовывать IS NULL, когда значение равно нулю.
var item = db.Items.Where( x => object.Equals( x.CategoryId, categoryId ) );