Eifrige Belastung eine Selbstreferenztabelle
-
06-07-2019 - |
Frage
Ich habe eine Standard -Selbstreferenzentabelle von Categories
. In meinem Entitätsmodell habe ich Assoziationen hergestellt Children
und Parent
. Ist es möglich, das Ganze zu laden? Category
Objekt ohne faules Laden?
Wenn ich den folgenden Code verwende, wird er nur auf die zweite Ebene geladen.
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;
Ist es möglich, Referenzen zu laden, wenn ich alle bereits geladenen Kategorieobjekte habe?
Eine Methode zum Laden besteht darin, das hinzuzufügen Children
Eigenschaft mehrmals
db.Categories.Include("Children.Children.Children.Children.Children")
Dies erzeugt jedoch einen sehr langen, wahnsinnigen T-SQL-Code und auch nicht das, was ich will.
Lösung
Nein, es ist nicht möglich. Bedenken Sie: Alle LINQ -zu -Entitäten -Abfragen werden in SQL übersetzt. Welche SQL-Aussage enthält eine unbegrenzte Tiefe in einer Selbstreferenzhierarchie? In Standard SQL gibt es keinen. Wenn es in T-SQL eine Erweiterung dafür gibt, weiß ich nicht, was es ist, und ich glaube auch nicht, dass EF-Anbieter dies tun.
Andere Tipps
Ok, Sie können in Betracht ziehen, die Lastmethode zu verwenden.
if (!category.Children.IsLoaded)
category.Children.Load();
Natürlich muss die Kategorie Entität von ObjectContext verfolgt werden.
Hier gibt es eine bessere Erklärung How-Does-Entramework-Work-With-recursive-hierarchien-include-Seems-Not-to.
Eine Möglichkeit, wie ich es gewohnt habe, das zu implementieren, wenn ich mehrere Einheiten habe, die ich alle Kinder in Selbstreferenztabelle bekommen möchte, ist zu verwenden rekursiver CTE und gespeicherte Prozedur Um ihre IDs mithilfe von Entity Framework zu erhalten:Hier ist der Code, der Entity Framework und Code erster Ansatz verwendet