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 :

LinqToEntities : .Include() récursif, comment faire?


Sujet :

Entity Framework

  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 LinqToEntities : .Include() récursif, comment faire?
    Bonjour à tous,

    J'ai un petit soucis avec EF.
    Voici l'EDMX:


    Je voudrais récupérer la hiérarchie des niveaux.
    Je fais donc :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public void NiveauGetAll()
    {
    	var db = new EntitiesDatabase();
    	var listNiveau = db.niveau
    		.Include("niveau_enfant")
    		.Where(n => n.niveau_parent == null).ToList();
    }
    => Je récupère le 1er niveau ainsi que c'est sous niveaux mais pas plus.
    Pour récupérer les sous niveaux des sous niveaux il faut que je rajoute ça:

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void NiveauGetAll()
    {
    	var db = new EntitiesDatabase();
    	var listNiveau = db.niveau
    		.Include("niveau_enfant")
    		.Include("niveau_enfant.niveau_enfant")
    		.Where(n => n.niveau_parent == null).ToList();
    }

    Le problème c'est que je ne connais pas à l'avance le nombre de sous niveau qu'il peut y avoir. Peut on faire un .Include() récursif?
    Merci d'avance.

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    Je vois le problème. Je ne sais pas si c'est lié à EF. C'est un problème d'ordre général. Si tu utilisais du SQL directement, tu aurais le même type de problème.

    Dans le projet sur lequel j'ai travaillé, j'ai aussi eu à gérer ça, mais comme c'était une imbrication de catégories simples, je l'ai fait à la main...

    En gros (pseudo-code, rien testé):
    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
    20
    21
    22
     
    public void NiveauGetAll()
    {
    	var db = new EntitiesDatabase();
    	var listNiveau = db.niveau.Where(n => n.niveau_parent == null);
     
                 foreach(var elem in listNiveau)
                 {
                      LoadChildren(db, elem);
                 }
     
    }
     
    public void loadChildren(EntitiesDatabase db, niveau elem)
    {
        db.Load<niveau>(elem, e=>e.niveau_enfant);
        foreach(var subelem in elem.niveau_enfant)
        {
                      LoadChildren(db, subelem);
        }
     
    }
    Je sais pas si c'est le plus efficace, mais si quelqu'un a une meilleure idée, je suis preneur...
    Sachant qu'il est possible de tout charger et de construire l'arborescence en mémoire ensuite....

    A+
    Christophe

  3. #3
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    db.niveau.ToList()

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    Citation Envoyé par anthyme Voir le message
    db.niveau.ToList()
    Oui, en fait si tu veux charger l'arbre entier à chaque fois, c'est le plus simple. Pour ma part je n'ai pas fait ça car mes entités sont transformées en simples DTO pour voyager dans un web service...

    Je nuancerai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    db.niveau.ToList().Where(n=>n.niveau_parent==null);
    Comme ça j'ai la liste des racines, mais avec les enfant déjà chargés !!

    Merci @anthyme !

  5. #5
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    Quand on manipule des arbres - qui est une notion purement objet - il vaut mieux essayer de tout loader en un minimum d'appels et faire un maximum de traitement dans le code ensuite pour de bonnes performances.

    Linq permet de mixer une partie SQL et objet séparé par le tolist() et donc de tout faire en une "requete logique"

    Apres il faut voir s'il y a des filtres à faire coté sql pour ne pas tout ramener.

    Bon courage pour la suite.

  6. #6
    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
    Merci pour tous ces conseils. Cela fonctionne parfaitement.

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

Discussions similaires

  1. Comment faire un include implicite?
    Par dehian dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 26/11/2009, 11h54
  2. Comment faire un JOIN récursif d'une table sur elle-même?
    Par PierreCaron dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/04/2009, 03h28
  3. Réponses: 10
    Dernier message: 11/07/2008, 11h48
  4. Réponses: 3
    Dernier message: 04/01/2008, 09h10
  5. [C# 2.0] Comment faire un include comme en php ?
    Par dymezac dans le forum ASP.NET
    Réponses: 4
    Dernier message: 22/09/2006, 11h37

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