2017-05-14 2 views
0

Ich habe eine Struktur von "Ordner" -Entitäten. Jeder Ordner verfügt über einen Verweis auf seinen übergeordneten Ordner, wodurch eine Standardbaumstruktur ermöglicht wird. Jeder Ordner kann auch eine Sammlung von Elementen enthalten, nennen wir sie "Artikel". Ein Artikel hat einen Titel und einen Körper. Angesichts der ID eines Stammordners möchte ich alle Unterordner und ihre Artikel abrufen. Ich möchte jedoch nur den Titel des Artikels abrufen, nicht seinen Körper. Ich beabsichtige, die Ordnerstruktur in einer Baumansicht anzuzeigen, und ich möchte den vollständigen Artikel nur abrufen, wenn der Benutzer den Artikel in der Strukturansicht auswählt.Abrufen von Daten hierarchisch in Entity Framework

Ich habe die Beziehungen wie so ein:

public class Folder: EntityBase 
{ 
    public string Name { get; set; } 

    public Guid ParentId { get; set; } 

    [ForeignKey(nameof(ParentId))] 
    public Folder Parent { get; set; } 

    public ICollection<Folder> Folders { get; set; } 

    public ICollection<Article> Articles { get; set; } 
} 

public class Article : EntityBase 
{ 
    public Guid FolderId { get; set; } 

    [ForeignKey(nameof(FolderId))] 
    public Folder Folder { get; set; } 

    // this needs to appear in the list 
    public string Title { get; set; } 

    // potentially large amount of data, retrieve only as necessary 
    public string Body { get; set; } 

    ... 
} 

Was ich nicht herausfinden kann, ist, wie Entity Framework zu sagen rekursiv Unterordner durch alle und ihre Unterordner zu gehen und so weiter. Muss ich Rekursion in meinem Code implementieren? Das scheint ein bisschen ineffizient. Gibt es einen bevorzugten Weg, damit umzugehen? Wie erhalte ich nur das Titelfeld meiner Artikel, nicht den ganzen Körper?

+0

LINQ + Rekursion ... wieder. –

+0

Können Sie diesen Kommentar näher erläutern? Ich bin unsicher über seine Absicht. – Shaggydog

+0

Mit ein wenig Wortspiel versuchte ich zu sagen, dass immer wieder Fragen zu LINQ und Rekursion gestellt werden. Es tut mir leid, dass ich ein wenig Zynismus über mich ergehen lassen kann. Es gibt einfach keine magische Kugel und es gibt sicher keine einzeilige Anweisung out of the box. –

Antwort

0

Muss ich Rekursion in meinem Code

Die Alternative rekursiv Laden von dem Client implementieren ist mit einer einzigen Abfrage alle Ordner laden, und EF-Fix-up, die die Beziehungen lassen. Wenn Sie nicht alle Ordner laden möchten, können Sie möglicherweise eine SQL-Abfrage verwenden, um nur die Ordner unter einem bestimmten Ordner (z. B. mit einem rekursiven CTE).

wie kann ich nur das Titelfeld meiner Aktion wird ausgeführt, nicht der ganze Körper

EF bietet keine Unterstützung für teilweise eine einzelne Entität geladen, aber man kann „Table Splitting“ verwenden Article aufzuspalten in eine separate Entität, auch wenn sie sich auf derselben Tabelle befindet.

+0

Wenn Sie gesagt hätten: * Alle Ordner laden *, wäre das keine schlechte Idee gewesen. Ich bin sogar geneigt zu denken, dass du das eigentlich sagen wolltest. Natürlich ist das Laden aller Artikel eine schlechte Idee, was wahrscheinlich der Grund für den Downvote ist. –

+0

Ja sollte alle Ordner laden. Welches Entity auch immer die Beziehung hat. Punkt ist, dass abgesehen von Eager Loading, Lazy Loading und Explicit Loading, eine wenig bekannte vierte Möglichkeit besteht, ein Objektdiagramm zu füllen. Laden Sie einfach eine Menge von Entitäten in einen DbContext und EF verbindet alle Navigationseigenschaften. –

Verwandte Themen