Почему null и ссылка на null не одно и то же - PullRequest
2 голосов
/ 09 июня 2011

Почему эти два метода работают по-разному:

    public List<Foo> GetFoos()
    {
        int? parentId = null;
        var l = _dataContext.Foos.Where(x => x.ParentElementId == parentId).ToList();
        return l;
    }

    public List<Foo> GetFoos()
    {
        var l = _dataContext.Foos.Where(x => x.ParentElementId == null).ToList();
        return l;
    }

Первый ничего не возвращает.Второй возвращает то, что ожидалось.Данные поступают из EF.ParentElementId обнуляется.

Ответы [ 3 ]

4 голосов
/ 10 июня 2011

Это потому, что вы не можете сравнить с нулем в SQL, у него есть специальный оператор IS NULL для проверки на нулевые значения.

Первый запрос будет преобразован в сравнение, где параметрnull:

WHERE ParentElementId = @param

Это не работает, потому что сравнение двух нулевых значений не дает true.

Второй запрос будет преобразован в нулевую проверку, потому что нулевое значениеконстанта:

WHERE ParentElementId IS NULL

Это работает, потому что EF не одурачен, чтобы перевести его в сравнение.

2 голосов
/ 10 июня 2011

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

  • Эта проблема обсуждалась на форумах MSDN .Некоторые люди считают, что это ошибка, другие говорят, что это преднамеренное поведение по причинам производительности
  • Всегда помогает запуск EFProf или Sql Server Profiler (в случае, если вы работаете с SQL ServerНапример, ваши два примера переводятся в два следующих утверждения соответственно:

    SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[ParentElementId] AS [ParentElementId]
    FROM [dbo].[Foo] AS [Extent1]
    WHERE [Extent1].[ParentElementId] = NULL
    
    SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[ParentElementId] AS [ParentElementId]
    FROM [dbo].[Foo] AS [Extent1]
    WHERE [Extent1].[ParentElementId] IS NULL
    

Этот метод (с учетом сгенерированного SQL) часто очень полезен при работе с проблемами в EF.

0 голосов
/ 09 июня 2011

Капитан Очевидность: потому что parentId не null, вероятно.

Ответ на редактирование : первый не компилируется.Тип не может быть выведен для нуля.

Ответ на другое редактирование : поскольку запрос EF неправильно переводит обнуляемые типы, вероятно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...