Question

J'ai une table d'auto-référencement standard de Catégories . Dans mon modèle d'entité, j'ai créé des associations Enfants et Parent . Est-il possible de charger tout l'objet Category sans chargement paresseux?

si j'utilise le code ci-dessous, il ne se charge qu'au deuxième niveau.

db.Categories.MergeOption = System.Data.Objects.MergeOption.NoTracking;

var query = from c in db.Categories.Include("Children")
            where c.IsVisible == true
            orderby c.SortOrder, c.Id
            select c;

Est-il possible de charger des références si tous les objets de catégorie sont déjà chargés?

Une méthode pour le charger consiste à ajouter plusieurs fois la propriété Enfants

db.Categories.Include("Children.Children.Children.Children.Children")

mais cela génère un très long code T-SQL insensé et ne fait pas ce que je veux.

Était-ce utile?

La solution

Non, ce n'est pas possible. Considérez: toutes les requêtes LINQ to Entities sont traduites en SQL. Quelle instruction SQL inclut une profondeur illimitée dans une hiérarchie à auto-référencement? En SQL standard, il n'y en a pas. S'il existe une extension pour cela dans T-SQL, je ne sais pas ce que c'est et je ne pense pas non plus que les fournisseurs EF le fassent.

Autres conseils

Ok, vous pourriez envisager d’utiliser la méthode Load.

 if (!category.Children.IsLoaded)
        category.Children.Load();

Bien entendu, les entités de catégorie doivent être suivies par ObjectContext.

Il y a meilleure explication ici comment fonctionne-t-elle-cadre-travail-avec-hiérarchies récursives-include-semble-pas-à

L'une des méthodes utilisées auparavant pour implémenter le fait que cte récursif et la procédure stockée soient associées à tous les enfants de la table d'auto-référencement de plusieurs entités est le suivant: obtenir leurs identifiants en utilisant Entity FrameWork: Voici le code utilisant Entity Framework et la première approche du code

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top