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

Entity framework core 如何使用EF Core递归检索记录的层次结构?,entity-framework-core,Entity Framework Core,我使用的是EF Core 2.1。我有一个具有以下属性的组对象: int-GroupId 智力?父组ID 组父组 该对象使用ParentGroupId属性引用其父对象的GroupId。查询时不知道层次结构的深度。如何检索整个层次结构 我尝试了以下方法,这将使我有三个层次,但我如何在不知道层次的深度的情况下获得层次结构的所有层次?我是否需要依赖存储过程 var group = await _membershipDbContext.Groups .Include(g => g.Pa

我使用的是EF Core 2.1。我有一个具有以下属性的组对象:

  • int-GroupId
  • 智力?父组ID
  • 组父组
该对象使用ParentGroupId属性引用其父对象的GroupId。查询时不知道层次结构的深度。如何检索整个层次结构

我尝试了以下方法,这将使我有三个层次,但我如何在不知道层次的深度的情况下获得层次结构的所有层次?我是否需要依赖存储过程

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

您有三种选择:

  • 使用延迟加载。这样,每次访问父组时,它都会自动从数据库中加载
  • 使用显式加载递归加载父组(请参阅)
  • 在数据库中创建一个视图或存储过程,该视图或存储过程将返回所需的所有数据,然后手动创建对象图
  • 哪种方法适合您取决于您独特的用例和要加载的数据量。
    选项1和2彼此没有太大区别,但使用选项2可以控制加载对象的时间。选项3可能是最有效的,但在保存更改时(当您手动变换对象图形时)可能会出现问题。

    您有三个选项:

  • 使用延迟加载。这样,每次访问父组时,它都会自动从数据库中加载
  • 使用显式加载递归加载父组(请参阅)
  • 在数据库中创建一个视图或存储过程,该视图或存储过程将返回所需的所有数据,然后手动创建对象图
  • 哪种方法适合您取决于您独特的用例和要加载的数据量。 选项1和2彼此没有太大区别,但使用选项2可以控制加载对象的时间。选项3可能是最有效的,但在保存更改时(手动变换对象图时)可能会出现问题