嵌套包含 Entity Framework 核心

Nested include Entity Framework Core

我正在为我的项目使用 EF Core。我在 EF Core 中遇到嵌套查询问题。

我有2个类:

public class PermissionGroupDefinitionEntity : IEntity
{
    public string Name { get; set; }
    public string NormalizedName { get; set; }
    public string DisplayName { get; set; }

    public virtual ICollection<PermissionDefinitionEntity> PermissionDefinitions { get; set; }
}

public class PermissionDefinitionEntity : IEntity
{
    public string Name { get; set; }
    public string NormalizedName { get; set; }
    public string DisplayName { get; set; }

    public bool IsEnabled { get; set; }
    public virtual string GroupName { get; set; }

    public virtual PermissionGroupDefinitionEntity Group { get; set; }
    public virtual ICollection<PermissionDefinitionEntity> Children { get; set; }
}

这是 ApplicationDbContext:

        builder.Entity<PermissionDefinitionEntity>().HasOne(r => r.Group).WithMany(r => r.PermissionDefinitions).OnDelete(DeleteBehavior.Cascade);
        builder.Entity<PermissionDefinitionEntity>().HasOne(r => r.Parent).WithMany(r => r.Children).OnDelete(DeleteBehavior.Cascade);

我想查询所有 PermissionGroupDefinitionEntity 包括 PermissionDefinitionEntityPermissionDefinitionEntity.

的自引用

我可以使用 EF Core 做到这一点吗?

你可以像这样使用.ThenInclude(i => ...)

var query = _context.PermissionGroupDefinitionEntity
  .AsNoTracking()
  .Include(i => i.PermissionDefinitions)
      .ThenInclude(i => i.Group)
  .AsQueryable();

编辑:

var query = _context.PermissionGroupDefinitionEntity
  .AsNoTracking()
  .Include(i => i.PermissionDefinitions)
      .ThenInclude(i => i.Children)
  .AsQueryable();

您需要递归加载 PermissionDefinitions 放置在 PermissionGroupDefinitionEntity.

首先,您应该使用以下查询加载所有 PermissionGroupDefinitionEntities,包括其子项:

var query = _dbContext.PermissionGroupDefinitionEntity
            .AsNoTracking()
            .Include(p => p.PermissionDefinitions )
            .ThenInclude(p => p.Children)
            .ToListAsync();

因为每个 PermissionGroupDefinitionEntity 都有一个 PermissionDefinition 的列表,所以你需要像下面代码这样的嵌套循环:

foreach (var PermissionGroupDefinitionEntity in PermissionGroupDefinitionEntities)
{
    foreach (var PermissionDefinitions in PermissionDefinitions)
    {

    }
}

然后在内部循环中你应该调用你的递归函数。

请参阅以下 link(在 Entity Framework Core 中递归获取所有子项的示例)

https://patrickdesjardins.com/blog/how-to-load-hierarchical-structure-with-recursive-with-entity-framework-5

这种方式性能很差,我不推荐这样做。

在这种情况下,您似乎必须在 SQL 中编写一个存储过程以获得更好的性能。