Почему EF не возвращает никаких результатов при сравнении нулевой переменной? - PullRequest
3 голосов
/ 15 марта 2012

У меня проблема с выбором данных в контексте данных в Entity Framework, и я сузил их до запроса нулевых значений.У меня есть метод, подобный этому:

public void DoStuff(int? someInt)
{
    var someData = dataContext.MyEntities.Where(x => x.SomeProperty == someInt);
    // someData always yields no results if someInt is null, even though
    // there are rows in the table that have null for that column.
}

Приведенный выше метод завершается ошибкой, если someInt является нулевым.Но эта строка работает:

var someData = dataContext.MyEntities.Where(x => x.SomeProperty == null);

Почему я получаю данные во втором, а не в первом?

Ответы [ 2 ]

6 голосов
/ 15 марта 2012

Полагаю, что он генерирует и использует запрос SQL в форме, которая ожидает ненулевое значение:

where x.SomeProperty = @param

Вместо SQL для отображения семантики с нулевым равенством c #:

where x.SomeProperty is null

(ключевым моментом здесь является то, что в c # ноль равен нулю; в ANSI-SQL ноль не равен ни нулю, ни (смущающе) не равен нулю - для проверки нулей необходим другой синтаксис)

Я видел, что LINQ-to-SQL делает то же самое, и согласен, что это нелогично.Единственное предложение, которое у меня есть: протестируйте параметр кандидата на null самостоятельно и вместо этого проведите проверку константы / литерала == null.Вероятно, он мог бы сделать то же самое, проверив дерево выражений и переписав его, если вы находитесь в деревьях выражений - но в специальном случае ноль проще.

0 голосов
/ 15 марта 2012

someInt не равно нулю само по себе. someInt.Value будет нулевым.

...