在实体框架中

时间:2017-05-14 13:07:56

标签: entity-framework hierarchy subdirectory

我有一个'文件夹'实体。每个文件夹都有对其父文件夹的引用,允许标准树结构。每个文件夹也可以包含一系列项目,让我们称之为“文章'”。一篇文章有​​一个标题和一个正文。鉴于根文件夹的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; }

    ...
}

我无法弄清楚如何告诉Entity Framework递归遍历所有子文件夹及其子文件夹等等。我必须在我的代码中实现递归吗?这似乎有点低效。有没有一种首选的方法来处理这个问题? 另外,我如何只检索文章的标题字段,而不是全身?

1 个答案:

答案 0 :(得分:0)

  

我是否必须在我的代码中实现递归

从客户端递归加载的替代方法是使用单个查询加载所有文件夹,并让EF修复关系。如果您不想加载所有文件夹,则可以将SQL查询仅用于特定文件夹下的文件夹(例如,使用递归CTE)。

  

如何只检索文章的标题字段,而不是全身

EF不支持部分加载单个实体,但您可以使用&#34; Table Splitting&#34;将ArticleBody拆分为单独的实体,即使它位于同一个表中。