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

C# Discussion :

Linq To Entities, problème quand la valeur dans le where est null!


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Points : 79
    Points
    79
    Par défaut Linq To Entities, problème quand la valeur dans le where est null!
    Bonjour à tous,
    J'utilise actuellement Linq To Entities, hors je rencontre un problème avec une relation 0..1
    Si il y a une valeur (donc 1), tout fonctionne, par contre dans le cas où j'ai null en bdd, alors ça plante à cause de l'objet qui n'existe pas dans le where.

    Tout d'abord, voici ma solution:
    Pièce jointe 76778

    Ma récupération Linq To Entities:
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    public class RequeteManager : Manager
        {
            public List<RequeteEntity> GetAll()
            {
                return Context.requete
                    .Include("provenance")
                    .ToList()
                    .Select(a=>new RequeteEntity()
                                   {
                                       Id = a.id_requete,
                                       Demande = a.demande,
                                       Provenance = Context.provenance
                                                        .Where(pr => pr.id_provenance == a.provenance.id_provenance)
                                                        .Select(pr => new ProvenanceEntity()
                                                                          {
                                                                              Id = pr.id_provenance,
                                                                              Nom = pr.nom
                                                                          })
                                                        .FirstOrDefault(),
     
                                        Priorite = Context.priorite
                                                        .Where(prio => prio.id_priorite == a.priorite.id_priorite)
                                                        .Select(prio => new PrioriteEntity(){
                                                                Id = prio.id_priorite,
                                                                Nom = prio.nom
                                                            })
                                                        .FirstOrDefault()
                                   })
                    .ToList();
            }
        }

    Ce qui coince c'est cette partie:
    .Where(prio => prio.id_priorite == a.priorite.id_priorite)
    Si il n'y a pas de priorité associée à une requête, la valeur du champs est "null" et j'ai donc le message suivant :
    Exception:Caught: Object reference not set to an instance of an object. (System.NullReferenceException)
    (C'est normal).

    Je me suis donc dit, je vais testé si la valeur est null:
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Priorite = Context.priorite
                                                        .Where(prio => a.priorite!=null)
                                                        .Where(prio => prio.id_priorite == a.priorite.id_priorite)
                                                        .Select(prio => new PrioriteEntity(){
                                                                Id = prio.id_priorite,
                                                                Nom = prio.nom
                                                            })
                                                        .FirstOrDefault()
    ]
    Et là:
    Exception:Thrown: Unable to create a constant value of type 'Closure type'. Only primitive types ('such as Int32, String, and Guid') are supported in this context. (System.NotSupportedException)
    J'ai essayé : .Where(prio => prio.id_priorite == ((a.priorite==null)?2:a.priorite.id_priorite))

    Bref, je n'ai rien trouvé de concluant sur Google et je ne m'en sort pas.
    Comment puis je faire sans avoir à récupérer toutes mes demandes, puis faire un foreach derrière. J'aimerai tout faire dans la même requête.

    Comment puis je faire svp? des pistes?

  2. #2
    Membre habitué Avatar de swif79
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 79
    Points : 169
    Points
    169
    Par défaut
    Bonjour,
    avec un & ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Priorite = Context.priorite
                               .Where(prio => (a.priorite!=null) & (prio => prio.id_priorite == a.priorite.id_priorite))
                               .Select(prio => new PrioriteEntity(){
                                            Id = prio.id_priorite,
                                            Nom = prio.nom
                                            }).FirstOrDefault()

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Points : 79
    Points
    79
    Par défaut
    J'ai essayé avec le && et j'ai le message d'erreur suivant:

    Exception:Thrown: "Impossible de créer une valeur constante de type «*Type de clôture*». Seuls les types primitifs («*par exemple Int32, String et Guid*») sont pris en charge dans ce contexte." (System.NotSupportedException)
    A System.NotSupportedException was thrown: "Impossible de créer une valeur constante de type «*Type de clôture*». Seuls les types primitifs («*par exemple Int32, String et Guid*») sont pris en charge dans ce contexte."

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Where(prio => a.priorite!=null && prio.id_priorite == a.priorite.id_priorite)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Points : 79
    Points
    79
    Par défaut
    J'ai la même erreur:

    Exception:Thrown: "Impossible de créer une valeur constante de type «*Type de clôture*». Seuls les types primitifs («*par exemple Int32, String et Guid*») sont pris en charge dans ce contexte." (System.NotSupportedException)
    A System.NotSupportedException was thrown: "Impossible de créer une valeur constante de type «*Type de clôture*». Seuls les types primitifs («*par exemple Int32, String et Guid*») sont pris en charge dans ce contexte."
    J'ai l'impression qu'il n'arrive pas à convertir null en sql!!!

  6. #6
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 570
    Points
    3 570
    Par défaut
    Le problème est que tu ne peux pas référencer une variable complexe dans une query EF. Tu ne peux referencer que des types simples (scalaire comme on dit dans le jargon) style int,string,...

    Le problème dans la query est la référence à la variable 'a'.
    Met l'id_priorite dans un int (ou string, suivant le stype) et reessaye.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par EquinoxeDotNet Voir le message
    Le problème est que tu ne peux pas référencer une variable complexe dans une query EF. Tu ne peux referencer que des types simples (scalaire comme on dit dans le jargon) style int,string,...

    Le problème dans la query est la référence à la variable 'a'.
    Met l'id_priorite dans un int (ou string, suivant le stype) et reessaye.
    Oui je pense effectivement que c'est ça le problème.

    On m'a soumis une idée qui fonctionne.
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    return Context.requete
                    .Include("provenance")
                    .Include("priorite")
                    .ToList()
                    .Select(a=>new RequeteEntity()
                                   {
                                       Id = a.id_requete,
                                       Demande = a.demande,
                                       Provenance = Context.provenance
                                                        .Where(pr => pr.id_provenance == a.provenance.id_provenance)
                                                        .Select(pr => new ProvenanceEntity(){
                                                                              Id = pr.id_provenance,
                                                                              Nom = pr.nom
                                                                          })
                                                        .FirstOrDefault(),
     
                                       Priorite = (a.priorite!=null)?Context.priorite
                                                        .Where(prio => prio.id_priorite == a.priorite.id_priorite)
                                                        .Select(prio => new PrioriteEntity(){
                                                                            Id = prio.id_priorite,
                                                                            Nom = prio.nom
                                                                        })
                                                        .FirstOrDefault():null
                                   })
                    .ToList();

  8. #8
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Attention! Avec ceci tu récupères tout le contenu des tables, ce qui peut être couteux!

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 20/02/2011, 18h17
  2. LinQ To Entity : Problème ManyToMany
    Par Julz0r dans le forum Linq
    Réponses: 5
    Dernier message: 06/01/2011, 17h40
  3. Des problèmes pour ajouter valeur dans une ArrayList
    Par Fused dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 07/11/2008, 16h28
  4. Problème récupérer les valeurs dans une Hash
    Par pymouse dans le forum Langage
    Réponses: 4
    Dernier message: 12/07/2007, 17h11
  5. Problème quand le champs de type Blob est null
    Par med_anis_dk dans le forum JDBC
    Réponses: 6
    Dernier message: 12/05/2007, 01h34

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