Обнуляемое значение в запросе - PullRequest
1 голос
/ 23 марта 2010

Мне нужно получить все предметы, у которых нет категорий

int? categoryId = null;
var items=db.Items.Where(x=>x.CategoryId==categoryId);

Этот код генерируется где:

where CategoryId=null

Вместо

where CategoryId is null

Хорошо, когда я пишу

var items=db.Items.Where(x=>x.CategoryId==null);

В моем профиле sql работает:

where CategoryId is null

Но когда я делаю этот хак, он не работает:

var items=db.Items.Where(x=>x.CategoryId==(categoryId.HasValue ? categoryId : null));

Так в чем проблема? Есть ли в L2S?

Обновление: если categoryId имеет значение, необходимо вернуть что-то вроде этого:

where CategoryId = 1

1 Ответ

2 голосов
/ 23 марта 2010

Вы можете попробовать:

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