IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linq Discussion :

[C#]Incohérence de where avec des valeurs nulles


Sujet :

Linq

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut [C#]Incohérence de where avec des valeurs nulles
    Bonjour,

    Je rencontre un problème avec linq to entities.

    Pour cerner au mieux le problème, j'ai une table client avec des clients contenant un nom (not null) et un prénom (qui peut être null)

    Si j'écris la condition suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     if( (from c in Bdd.Client
                   where c.Nom.Equals(clientsource.Nom) 
                   &&  c.Prenom.Equals(clientsource.Prenom)
                   select c).FirstOrDefault() == null)
               {...
    ou évidemment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if((from c in Bdd.Client
                 where c.Nom == clientsource.Nom 
                 && c.Prenom == clientsource.Prenom
                 select c).FirstOrDefault() == null)
                 {...
    Je m'attend à valider la condition SI dans ma base de données il n'y a pas déjà un client avec le même nom et le même prénom que mon client "clientsource".

    Or, voici ce que j'obtiens avec 3 exemples simples (nom, prénom) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Base contient          clientsource                    résultat
    Albert,Chose           Albert,Chose                    not null (OK)
    Albert,Chose           Albert,Machin                   null (OK)
    Albert,null            Albert,null                     null (PAS BON)
    Bref, si le nom existe déjà dans la base, mais que les prénoms sont null, alors linq to entities considère que les prénoms sont différents.

    Quelqu'un peut m'expliquer ce problème qui consiste à constater que null != null?

    Merci d'avance

    Claude

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Citation Envoyé par ClaudeBg Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     if( (from c in Bdd.Client
                   where c.Nom.Equals(clientsource.Nom) 
                   &&  c.Prenom.Equals(clientsource.Prenom)
                   select c).FirstOrDefault() == null)
               {...
    Si ton prénom est Null, l'appel en gras lève une exception. Donc tester juste avant si c.Prenom n'est pas null, ou dire à clientsource.Prenom de traiter le Equals si cette valeur est toujours existante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if( (from c in Bdd.Client
                   where c.Nom.Equals(clientsource.Nom) 
                   &&  (( c.Prenom == null && clientsource.Prenom == null) || 
                         ( c.Prenom != null  && c.Prenom.Equals(clientsource.Prenom))
                   select c).FirstOrDefault() == null)
    L'exception entraine que FirstOrDefault retourne null, et donc que ta condition se vérifie alors que ca ne devrait pas être le cas.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Salut
    -----

    Si ton prénom est Null, l'appel en gras lève une exception. Donc tester juste avant si c.Prenom n'est pas null, ou dire à clientsource.Prenom de traiter le Equals si cette valeur est toujours existante.
    Ok, merci, je comprends.
    Dommage que cette exception ne soit pas reportée pour qu'on puisse s'en apercevoir. En fait, il faut la deviner, ce n'est pas très efficace d'avoir une erreur de ce type non signalée.

    Avec ton code, effectivement ça fonctionne, même si c'est un peu plus lourd.

    Encore merci

    Claude

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    En effet, il faut faire attention aux NULL avec Linq, sinon on se retrouve avec es données incohérentes.

    En effet c'est un peu plus lourd, après si le client fournit toujours un prénom pour contrôle, base toi sur ce prénom pour tester l'égalité dans ta requête.

    Et n'oublies pas le tag résolu

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Salut

    Oui, merci.

    Pour éviter ce genre de problème, j'ai modifié tous les champs de toutes les tables pour qu'ils soient "NOT NULL", et au lieu d'engistrer une valeur null pour un champs non utilisé, j'y met la valeur string.empty (""). C'est moins élégant, mais vu les circonstances c'est plus sûr.

    Encore merci

    Claude

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] GridView et dropdownlist avec des valeur null
    Par miniil dans le forum ASP.NET
    Réponses: 1
    Dernier message: 23/05/2013, 23h07
  2. trouver les noeuds avec des valeurs nulles
    Par awalter1 dans le forum Général Python
    Réponses: 3
    Dernier message: 28/10/2010, 14h33
  3. UNIQUE index avec des valeurs null
    Par DeeVoiD dans le forum MySQL
    Réponses: 2
    Dernier message: 24/03/2009, 16h18
  4. Création d'un graphique OWC avec des valeurs nulles/vides
    Par SorrowLane dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 17/07/2008, 14h37
  5. Problème de "select" avec des valeurs a null
    Par SchpatziBreizh dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/07/2005, 16h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo