Une possibilité - si mt.PARENT_KEY
est d'un autre type (par exemple long?
) alors il y aura des conversions impliquées.
Il serait utile si vous pouviez montrer les types impliqués et la requête générée dans chaque cas.
EDIT: Je pense avoir une idée ...
Il pourrait être parce que # SQL et C ont des idées différentes de ce que l'égalité signifie quand il vient à null. Essayez ceci:
where (mt.PARENT_KEY == id) || (mt.PARENT_KEY == null && id == null)
Si cette est le cas, alors il est un cas d'angle assez laid, mais je peux comprendre pourquoi il est fait de cette façon ... si le SQL généré est juste en utilisant
WHERE PARENT_KEY = @value
alors cela ne fonctionnera pas lorsque la valeur est nulle - il a besoin:
WHERE (PARENT_KEY = @value) OR (PARENT_KEY IS NULL AND @value IS NULL)
qui est ce que devrait générer cette dernière requête LINQ.
Sur intérêt, pourquoi la sélection avec
select new { mt.NAME }
au lieu de simplement
select mt.NAME
?) Pourquoi voudriez-vous une séquence de types anonymes au lieu d'une séquence de chaînes (ou quel que soit le type NAME
est?
Avez-vous essayé d'analyser le SQL généré dans chaque cas? Quel est le type de mt.PARENT_KEY? –
la clé parent est un entier –
Dans le code généré? Nullable, Nullable ? –