2010-03-23 3 views
1

мне нужно получить все элементы они не имеют категорииNullable значение в запросе

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 Profiler это работает:

where CategoryId is null 

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

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

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

Update: если CategoryId имеет значение его нужно вернуть что-то вроде этого:

where CategoryId = 1 

ответ

2

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

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

Проблема с первым образцом является то, что LINQ не смотрит на значение переменной при построении выражения. Он просто видит выражение равенства и преобразует его в эквивалентное выражение в SQL. LINQ требует, чтобы разработчик знал и понимал, как это работает в отношении проверки нулевых значений. Я думаю, что я дал вам самый простой способ сделать это.

Редактировать: на основе вашего комментария. Вы можете создавать альтернативные запросы, если вы ищете соответствия categoryId или id нулевой категории, если 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, кажется compell LINQ к SQL построитель выражений для реализации IS NULL, если значение равно нулю.

var item = db.Items.Where(x => object.Equals(x.CategoryId, categoryId)); 
+0

мне нужно, когда CategoryId имеет значение будет возвращать где CategoryId = значение, если не CategoryId равна нулю – Sasha

+0

@msony - я обновил. – tvanfosson

+0

вот что я сделал, но в моем случае у меня есть 10 значений, поэтому для этого запроса у меня много кода :( thank u для быстрого ответа – Sasha

Смежные вопросы