Одна возможность - если 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
?