2012-02-14 2 views
6

Похож на глупый вопрос, но я просто не понимаю. Моя сущность:Выражение Linq с нулевым значением

public class Page 
{ 
    public int Id { get; set; } 
    //... 
    public int? ParentId { get; set; } 
} 

В контроллере:

db.Pages.First(x => x.ParentId == null); 

Работы, как и ожидалось (возвращает некоторый элемент). Но:

int? test = null; 
db.Pages.First(x => x.ParentId == test); 

Броски Sequence contains no elements

Что я скучаю?

+1

Вы используете linq-to-entity? Это не имеет ничего общего с asp.net-mvc? – gideon

ответ

10

Я считаю, что есть некоторые странности вокруг нулей с некоторыми поставщиками LINQ. Попробуйте:

var query = db.Pages.First(x => (test != null && x.ParentId == test) || 
           (test == null && x.ParentId == null)); 

В качестве альтернативы, использовать различные запросы для различных ситуаций:

var query = test == null ? db.Pages.First(x => x.ParentId == null) 
         : db.Pages.First(x => x.ParentId == test); 

В основном это происходит потому, что SQL обрабатывает NULL, как неравный самому себе, так:

WHERE X = Y 

будет по-прежнему не если оба X и Y являются нулевыми значениями. Использование части == nullбуква null) заставляет преобразовать значение ISNULL или что-то, что эквивалентно SQL.

Я согласен, что это боль, а у кого-то еще может быть лучшее обходное решение, но это может помочь вам разобраться.

+2

_better workaround_ Переход к достойному провайдеру LINQ, ling NH ... – gdoron

1

Попробуйте (модифицирована в соответствии с комментарием gdoron теперь это именно то, что отвечал Гидеон, поэтому пожалуйста, примите его вместо моего.):

int? test = null; 
if(test.HasValue) { 
    db.Pages.First(x => x.ParentId == test.Value); 
} else { 
    db.Pages.First(x => x.ParentId == null); 
} 
+2

Не получится. 'Value - значение текущего объекта Nullable (Of T), если свойство HasValue имеет значение true. ==> Исключено, если свойство HasValue является ложным. <== ' – gdoron

+0

Да, спасибо за подсказку. –

+0

thx для этого решения, но я просто хотел понять, что странность LINQ – Wonder

2

Вы могли бы сделать что-то вроде этого, как обходной путь:

int? test = null; 
if(test.HasValue) { 
db.Pages.First(x => x.ParentId == test.Value); 
} else { 
db.Pages.First(x => x.ParentId == null); 
} 

Я предполагаю, что, поскольку на самом деле int? провайдер Nullable<int> наши LINQ к лицам, не сравнивая вещи правильно.

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