Linq выражение с обнуляемым - PullRequest
6 голосов
/ 14 февраля 2012

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

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

Что мне не хватает?

Ответы [ 3 ]

10 голосов
/ 14 февраля 2012

Я полагаю, что с некоторыми поставщиками 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 являются нулевыми значениями.Использование части == nullliteral null) вызывает преобразование в ISNULL или любой другой эквивалент SQL.

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

2 голосов
/ 14 февраля 2012

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

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-to-entity не сравнивает вещи правильно.

1 голос
/ 14 февраля 2012

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

int? test = null;
if(test.HasValue) {
    db.Pages.First(x => x.ParentId == test.Value);
} else {
    db.Pages.First(x => x.ParentId == null);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...