2017-05-14 4 views
0

J'ai une structure d'entités 'Dossier'. Chaque dossier a une référence à son dossier parent, permettant une arborescence standard. Chaque dossier peut également contenir une collection d'éléments, appelons-les 'Articles'. Un article a un titre et un corps. Étant donné l'ID d'un dossier racine, je souhaite récupérer tous les sous-dossiers et leurs articles. Cependant, je veux seulement récupérer le titre de l'article, pas son corps. J'ai l'intention d'afficher la structure du dossier dans une arborescence et je souhaite récupérer l'article complet uniquement si l'utilisateur sélectionne l'article dans l'arborescence.Récupérer des données de manière hiérarchique dans Entity Framework

J'ai mis en place les relations comme si:

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; } 

    ... 
} 

Ce que je ne peux pas comprendre est comment dire Entity Framework pour aller récursive dans tous les sous-dossiers et leurs sous-dossiers et ainsi de suite. Dois-je implémenter la récursivité dans mon code? Cela semble un peu inefficace. Y a-t-il un moyen préféré de gérer cela? En outre, comment est-ce que je récupère juste le champ de titre de mes articles, pas le corps entier?

+0

LINQ + récursivité ... à nouveau. –

+0

Pourriez-vous élaborer sur ce commentaire? Je ne suis pas sûr de son intention. – Shaggydog

+0

Avec un petit jeu de mots, j'ai essayé de dire que les questions sur LINQ et la récursivité sont posées à maintes reprises. Désolé de laisser un peu de cynisme prendre le dessus sur moi. Il n'y a pas de solution miracle et il n'y a certainement pas de déclaration d'une seule ligne. –

Répondre

0

Dois-je mettre en œuvre récursion dans mon code

L'alternative chargement récursive du client est de charger tous les dossiers avec une seule requête, et laissez-fix-up EF les relations. Si vous ne voulez pas charger tous les dossiers, vous pouvez utiliser une requête SQL uniquement pour les dossiers sous un dossier particulier (par exemple en utilisant un CTE récursif).

comment puis-je récupérer tout le champ titre de mes articles, et non le corps entier

EF ne supporte pas le chargement partiellement une seule entité, mais vous pouvez utiliser « Tableau Fractionnement » pour diviser ArticleBody dans une entité distincte, même si elle est sur la même table.

+0

Si vous aviez dit * charger tous les dossiers * cela n'aurait pas été une mauvaise idée. Je suis même enclin à penser que vous vouliez dire cela. Bien sûr, charger tous les articles est une mauvaise idée, ce qui est probablement la raison de la downvote. –

+0

Oui aurait dû être charger tous les dossiers. Quelle que soit l'entité a la relation. Le point est qu'en dehors du chargement rapide, du chargement différé et du chargement explicite, il existe une quatrième façon peu connue de remplir un graphique d'objet. Il suffit de charger un tas d'entités dans un DbContext et EF va connecter toutes les propriétés de navigation. –