如何使用EF Core递归检索记录的层次结构?

时间:2019-10-15 17:22:20

标签: entity-framework-core

我正在使用EF Core 2.1。我有一个具有以下属性的Group对象:

  • int GroupId
  • int? ParentGroupId
  • 组ParentGroup

该对象使用ParentGroupId属性引用其父级的GroupId。查询时未知层次结构的深度。如何检索整个层次结构?

我尝试了以下操作,这将使我更深入三个层次,但是如何在不知道深度的情况下获得层次结构的所有层次?我需要依赖存储的proc吗?

var group = await _membershipDbContext.Groups
    .Include(g => g.ParentGroup)
        .ThenInclude(g => g.ParentGroup)
    .SingleOrDefaultAsync(g => g.GroupId == id);

1 个答案:

答案 0 :(得分:2)

您有三个选择:

  1. 使用延迟加载。这样,每次访问父组时,它将自动从数据库中加载。
  2. 使用显式加载以递归方式加载父组(请参见explicit loading
  3. 在数据库中创建一个视图或存储过程,该视图或存储过程将返回所需的所有数据,然后手动创建对象图。

哪种方法最适合您,取决于您的独特用例和要加载的数据量。 选项1和2并没有什么不同,但是使用选项2可以控制何时加载对象。选项3可能是最有效的,但在保存更改(手动更改对象图时)时可能会出现问题。