11
votes

Linq à SQL - types nullables dans la clause

J'ai une table avec une colonne qui a des valeurs nulelles ... Lorsque j'essaie d'interroger pour les enregistrements où cette colonne est NULL:

Ceci fonctionne: P>


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


2 commentaires

Avez-vous essayé de regarder le SQL généré dans chaque cas? Quel est le type de mt.parent_key?


Dans le code généré? Nullable , nullable ?


3 Réponses :


5
votes

Une possibilité - si mt.parent_key code> est d'un autre type (par exemple long? code>), il y aura des conversions impliquées.

Cela aiderait si vous pouviez montrer les types impliqués et la requête générée dans chaque cas. p>

EDIT: Je pense avoir une idée ... P>

Cela pourrait être parce que SQL et C # ont des idées différentes de quelle égalité signifie quand il s'agit de null. Essayez ceci: p> xxx pré>

si ce est em> le cas alors c'est un étui de coin jolie, mais je peux comprendre pourquoi c'est fait de cette façon ... Si le SQL généré vient d'utiliser P>

select mt.NAME


1 commentaires

J'ai mis à jour la réponse de Nick pour refléter la manière dont les objets.equaux rendent à SQL. À votre avis, est l'extra (mt.parent_key n'est pas null) et (@ID n'est pas null) en ligne 2 superflu? Ceci est suggéré par votre réponse. (Plus de caractères de Linq, moins de caractères de SQL)



0
votes

C'est définitivement une question de C # et SQL ayant des notions différentes de la comparaison des NULLS - la question a été abordée ici avant:

comparer des types nullables à Linq à SQL


0 commentaires

20
votes

Après plus d'autres googles, j'ai trouvé la réponse:

Ref # 1 p>

Ref # 2 P>

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


0 commentaires