Eager charge une table d'auto-référencement
-
06-07-2019 - |
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.
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