2017-05-14 115 views
0

我有一个'文件夹'实体的结构。每个文件夹都有一个对其父文件夹的引用,允许标准的树结构。每个文件夹也可以有一个项目集合,我们称它们为'文章'。一篇文章有​​一个标题和一个正文。鉴于根文件夹的ID,我想检索所有子文件夹及其文章。但是,我只想检索文章标题,而不是其正文。我打算在树视图中显示文件夹结构,并且我只想在用户选择树视图中的文章时检索完整文章。在实体框架中分层检索数据

我已经建立了像这样的关系:

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

    ... 
} 

我想不通的是如何跟实体框架递归遍历所有子文件夹及其子文件夹等。我必须在我的代码中实现递归吗?这似乎有点低效。有没有一种首选的方法来处理这个问题? 另外,我如何检索我的文章的标题字段,而不是整个身体?

+0

LINQ +递归...再次。 –

+0

您能否详细说明该评论?我不确定它的意图。 – Shaggydog

+0

用一点点的双关语我试着说,关于LINQ和递归的问题被一次又一次地问到。对不起,让一些玩世不恭的人变得更好。没有什么灵丹妙药,开箱后肯定没有单行的说法。 –

回答

0

我一定要实现递归在我的代码

从客户端加载递归另一种方法是加载所有的文件夹使用单个查询,并让EF修复行动的关系。如果你不想加载所有的文件夹,你可以使用SQL查询来访问特定文件夹下的文件夹(例如使用递归CTE)。

如何取回只是我的文章的标题字段,而不是整个身体

EF不支持部分加载一个单独的实体,但你可以使用“表格拆分”分裂ArticleBody成一个单独的实体,即使它在同一张桌子上。

+0

如果你说*加载所有文件夹*这不会是一个坏主意。我甚至倾向于认为你确实打算这么说。当然,加载所有文章是一个坏主意,这可能是downvote的原因。 –

+0

是应该加载所有文件夹。无论哪个实体都有关系。除了Eager Loading,Lazy Loading和Explicit Loading以外,还有一点鲜为人知的第四种方法来填充对象图。只需将一堆实体加载到DbContext中,EF将连接所有导航属性。 –