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

Entity Framework Discussion :

Problème d'Include et de Where [Débutant]


Sujet :

Entity Framework

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut Problème d'Include et de Where
    Salut,

    Nouveau dans l'EF, je butte comme visiblement bcp de monde sur la même pierre, et malgré mes recherches ne n'arrive pas à m'en sortir. Aussi je vais appel à vos connaissances.

    Je me lie a PostgreSQL via EF6, npgsql et EF6.npgsql.

    Soit une table minutes contenant plein de choses et qui est liée à plusieurs autres tables, mais surtout qui contient le champs id_minute (int).
    Soit la table intermédiaire minutes_anc_lots qui contient les champs id_minute (int), id_anc_lot (str) et ptie (bool). Vu qu'il y a le champs ptie, EF ne fait pas de lien many to many.
    Et enfin la table anc_lots qui contient, entre autre id_anc_lot (str), code_ds (str), et no_lot (str).

    Le but de ma recherche est de sortir toutes les minutes dont dont les anc_lots répondent a certains critères de code_ds et de no_lot (en y incluant toutes les autres tables liées, mais ça je suppose que ce sera juste une liste d'Include).

    Je n'ai pas réussi à faire le Linq d'un coup, alors j'ai essayé en 2 étapes, mais je n'y arrive pas plus.

    J'ai d'abord essayé
    Code : 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
                            if (string.IsNullOrEmpty(SelectedDesSec.Code))
                            {
                                var minutes = ctr.minutes
                                                .Include(min => min.minutes_anc_lots.Select(mal => mal.anc_lots)
                                                                                    .Where(al => al.no_lot.CompareTo(ALotFrom) >= 0
                                                                                               && al.no_lot.CompareTo(ALotTo) <= 0)
                                                                                    )
                               .ToList();
                            }
                            else
                            {
                                var minutes = ctr.minutes
                                                 .Include(min => min.minutes_anc_lots.Select(mal => mals.anc_lots)
                                                                                     .Where(al => al.code_ds == SelectedDesSec.Code
                                                                                                && al.no_lot.CompareTo(ALotFrom) >= 0
                                                                                                && al.no_lot.CompareTo(ALotTo) <= 0)
                                                                                     )
                                .ToList();
                            }
    Mais je reçois l'erreur
    The Include path expression must refer to a navigation property defined on the type. Use dotted paths for reference navigation properties and the Select operator for collection navigation properties.
    Nom du paramètre : path
    Je ne comprend pas de quoi il s'agit, et mes recherches ne m'ont pas permis de trouver l'explication.

    Ne réussissant pas à résoudre ce problème, j'ai tenté une approche en 2 étapes. Mais ça ne fonctionne pas non plus.
    J'en suis à :
    Code : 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
                            List<minutes_anc_lots> m_a_l = null;
                            if (string.IsNullOrEmpty(SelectedDesSec.Code))
                                m_a_l = ctr.minutes_anc_lots
                                           .Include("anc_lots")
                                           .Where(al => al.anc_lots.no_lot.CompareTo(ALotFrom) >= 0
                                                      && al.anc_lots.no_lot.CompareTo(ALotTo) <= 0).ToList() as List<minutes_anc_lots>;
                            else
                                m_a_l = ctr.minutes_anc_lots
                                           .Include("anc_lots")
                                           .Where(al => al.anc_lots.code_ds == SelectedDesSec.Code
                                                      && al.anc_lots.no_lot.CompareTo(ALotFrom) >= 0
                                                      && al.anc_lots.no_lot.CompareTo(ALotTo) <= 0).ToList() as List<minutes_anc_lots>;
     
     
     
                            var test = ctr.minutes
                                          .Include("minutes_anc_lots")
                                          .Include("anc_lots")
                                          .Any(mal => m_a_l.Contains((minutes_anc_lots)mal.minutes_anc_lots));
    le m_a_l me donne bien les minutes_anc_lots concernés, mais au moment du passage à var test, j'ai l'erreur
    Unable to create a constant value of type 'Appli.minutes_anc_lots'. Only primitive types or enumeration types are supported in this context.
    Malheureusement mes recherches ne m'ont pas plus permis de trouver de solution à cette erreur.

    Qu'est-ce que je fais mal et comment dois-je me corriger ?

    Merci.
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Points : 1 498
    Points
    1 498
    Par défaut
    Pour chainer les includes avec ef il faut utiliser la methode ThenInclude, donc si on reprends ta derniere requete, ca donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var test = ctr.minutes
        .Include(m=> m.minutes_anc_lots)
        .ThenInclude(minutes_anc_lot=>minutes_anc_lot.anc_lots)
        .Where(m=>m.minutes_anc_lots.Any(minutes_anc_lot=>minutes_anc_lot.anc_lots.Any(
            l=>l.code_ds == SelectedDesSec.Code
            && l.no_lot.CompareTo(ALotFrom) >= 0
            && l.no_lot.CompareTo(ALotTo) >= 0));
    De plus si tu fais le Where dans le include, tu va filtrer les inclusion, pas le resultat final. Je te conseille de lire les exemples: https://stackoverflow.com/questions/...in-theninclude et https://stackoverflow.com/questions/...ude-in-ef-core

    Bonne chance.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    Citation Envoyé par mermich Voir le message
    Pour chainer les includes avec ef il faut utiliser la methode ThenInclude
    Merci de ton aide, mermich.
    J'avais trouvé le ThenInclude dans de la doc, mais sur le .ThenInclude il me retourne une erreur CS1061 : "'IQueryable<minutes>' ne contient pas de définition pour 'ThenInclude' et aucune méthode d'extension accessible 'ThenInclude' acceptant un premier argument de type 'IQueryable<minutes>' n'a été trouvée (une directive using ou une référence d'assembly est-elle manquante ?)"

    Je ne sais pas pq cette erreur. Vu que c'est EF qui a fait le rapatriement des tables, des liaisons, etc ... et que ce sont des classes générées automatiquement, je me dis que ce n'est pas parce que j'ai oublié qqch qqpart. Je ne comprend pas d'où provient cette erreur. Et comme je n'arrive pas à trouver d'où elle vient (la recherche que j'ai faite sur l'erreur CS1061 ne m'a pas donné de piste), je ne sais pas comment la corriger.
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Points : 1 498
    Points
    1 498
    Par défaut
    Ok autant pour moi tu utiliseses EF^ et non pas EF core...

    donc pour le include en cascades t'etais pas loin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var test = ctr.minutes .Include("minutes_anc_lots.anc_lots")
    ca devrais inclure a la fois les anc_lots et les lots.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    Merci.

    En mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var test = ctr.minutes
        .Include("minutes_anc_lots")
        .Include("minutes_anc_lots.anc_lots")
        .Where(m => m.minutes_anc_lots.Any(minutes_anc_lot => minutes_anc_lot.anc_lots.Any(
              l => l.code_ds == SelectedDesSec.Code
              && l.no_lot.CompareTo(ALotFrom) >= 0
              && l.no_lot.CompareTo(ALotTo) >= 0)));
    J'avais une erreur sur le second Any ("...minutes_anc_lot.anc_lots.Any(").
    Il me sortait encore une erreur CS1061 (Pas de Any dans anc_lots). Mais là j'ai mieux compris. En effet, anc_lots est la classe qui représente chaque anc_lot (le s vient de la pluralité dans EF). Il n'y a donc pas de Any et je me suis dont dit que je suis un étage trop bas.
    J'ai donc tenté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                            var test = ctr.minutes
                                        .Include("minutes_anc_lots")
                                        .Include("minutes_anc_lots.anc_lots")
                                        .Where(m => m.minutes_anc_lots.Any(minutes_anc_lot => minutes_anc_lot.anc_lots.code_ds == SelectedDesSec.Code
                                                                                           && minutes_anc_lot.anc_lots.no_lot.CompareTo(ALotFrom) >= 0
                                                                                           && minutes_anc_lot.anc_lots.no_lot.CompareTo(ALotTo) <= 0)).ToList();
    Et là ça fonctionne.

    Merci beaucoup de ton aide.
    Elle m'a aidé à mieux comprendre.
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

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

Discussions similaires

  1. [Configuration] problème d'include à cause de l'arborescence
    Par hoaxpunk dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 15/12/2005, 17h00
  2. [EasyPHP] Problème d'include de fichier et adresse des images
    Par doudou34 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 02/11/2005, 21h46
  3. problèmes avec "include file" pour une page asp
    Par chipsense dans le forum ASP
    Réponses: 1
    Dernier message: 02/09/2005, 15h22
  4. [JSP] problème d'include ou d'import
    Par lipao17 dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 06/04/2005, 13h39
  5. Problème d'include sous Dev-c++ 4.9.8.0
    Par Argonz dans le forum Dev-C++
    Réponses: 16
    Dernier message: 20/11/2003, 17h36

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