LINQ to SQL - обнуляемые типы в предложении where - PullRequest
11 голосов
/ 14 июля 2009

У меня есть таблица со столбцом, который имеет нулевые значения ... когда я пытаюсь запросить записи, где этот столбец равен NULL:

ЭТО РАБОТАЕТ:



        var list = from mt in db.MY_TABLE
                   where mt.PARENT_KEY == null
                   select new { mt.NAME };

ЭТО НЕ:



        int? id = null;
        var list = from mt in db.MY_TABLE
                   where mt.PARENT_KEY == id
                   select new { mt.NAME };

Почему?

Ответы [ 3 ]

20 голосов
/ 14 июля 2009

после еще одного поиска, я нашел ответ:

ref # 1

ref # 2

int? id = null;
var list = from mt in db.MY_TABLE
           where object.Equals(mt.PARENT_KEY, id)  //use object.Equals for nullable field
           select new { mt.NAME };

Этот LINQ визуализируется в SQL следующим образом:

((mt.PARENT_KEY IS NULL) AND (@id IS NULL)) 
OR ((mt.PARENT_KEY IS NOT NULL) AND (@id IS NOT NULL) AND (mt.PARENT_KEY = @id))
5 голосов
/ 14 июля 2009

Одна возможность - если mt.PARENT_KEY другого типа (например, long?), тогда будут происходить преобразования.

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

РЕДАКТИРОВАТЬ: Я думаю, у меня есть идея ...

Это может быть потому, что SQL и C # имеют разные представления о том, что означает равенство, когда дело доходит до нуля. Попробуйте это:

where (mt.PARENT_KEY == id) || (mt.PARENT_KEY == null && id == null)

Если это это случай, то это довольно уродливый угловой случай, но я могу понять, почему это так ... если генерируемый SQL просто использует

WHERE PARENT_KEY = @value

тогда это не будет работать, когда значение равно нулю - ему нужно:

WHERE (PARENT_KEY = @value) OR (PARENT_KEY IS NULL AND @value IS NULL)

это то, что должен генерировать последний запрос LINQ.


Из интереса, почему вы выбираете с

select new { mt.NAME }

вместо

select mt.NAME

?) Зачем вам нужна последовательность анонимных типов вместо последовательности строк (или типа NAME?

1 голос
/ 14 июля 2009

Определенно дело в том, что C # и SQL имеют разные представления о том, как сравнивать нули - этот вопрос уже рассматривался ранее:

Сравните типы, допускающие обнуление, в Linq с Sql

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