LINQ to SQL - типы с нулевым значением в where where

У меня есть таблица со столбцом с нулевыми значениями... когда я пытаюсь запросить записи, где этот столбец IS 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 };

Почему?

Ответ 1

после еще нескольких поисковых запросов я нашел ответ:

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))

Ответ 2

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

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

EDIT: Я думаю, у меня есть идея...

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

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

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

WHERE PARENT_KEY = @value

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

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

который должен генерировать последний запрос LINQ.


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

select new { mt.NAME }

вместо

select mt.NAME

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