7 votes

La requête Linq fonctionne avec null mais pas avec int ? dans la clause where

J'ai une fonction de requête linq comme (simplifié) :

public IList<Document> ListDocuments(int? parentID)
{
    return (
        from doc in dbContext.Documents
        where doc.ParentID == parentID
        select new Document
        {
            ID = doc.ID,
            ParentID = doc.ParentID,
            Name = doc.SomeOtherVar
        }).ToList();
}

Maintenant, pour une raison quelconque, lorsque je passe null pour le parentID (actuellement, je n'ai que des données avec des parentIDs null), je n'obtiens aucun résultat.

Je copie et colle cette requête dans LinqPad et j'exécute ce qui suit :

from doc in dbContext.Documents
where doc.ParentID == null
select doc

Je reçois un ensemble de résultats comme prévu...

La requête actuelle comporte des jointures à gauche et d'autres jointures, mais je les ai supprimées et testées et j'ai obtenu le même résultat, de sorte que les jointures n'affectent rien. L'application et LinqPad sont tous deux connectés à la même base de données.

Editer : J'ai testé avec seulement 'null' dans la requête de l'application et il retourne le résultat comme prévu, donc le problème est l'utilisation de null vs int ? J'ai mis à jour la question pour qu'elle soit plus utile aux autres personnes qui ont le même problème et qui trouveront ce fil de discussion.

19voto

kvb Points 35490

Littéral null sont traitées différemment des paramètres qui peuvent être nuls. Lorsque vous testez explicitement contre null le code SQL généré utilisera l'option IS NULL mais lorsque vous utilisez un paramètre, il utilisera l'opérateur standard = ce qui signifie qu'aucune ligne ne correspondra, car en SQL null n'est égal à rien. Il s'agit de l'une des incohérences sémantiques .NET/SQL les plus gênantes dans LINQ to SQL. Pour la contourner, vous pouvez utiliser une clause comme :

where doc.ParentID == parentID || (doc.ParentID == null && parentID == null)

0voto

Tokstow Points 11

Vous pouvez également utiliser quelque chose comme ...

from doc in dbContext.Documents
where doc.IsParentIDNull()
select doc

Cela a fonctionné pour moi ! J'espère que cela fonctionnera pour vous !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X