嵌套包含 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
包括 PermissionDefinitionEntity
和 PermissionDefinitionEntity
.
的自引用
我可以使用 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 中递归获取所有子项的示例)
这种方式性能很差,我不推荐这样做。
在这种情况下,您似乎必须在 SQL 中编写一个存储过程以获得更好的性能。
我正在为我的项目使用 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
包括 PermissionDefinitionEntity
和 PermissionDefinitionEntity
.
我可以使用 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 中递归获取所有子项的示例)
这种方式性能很差,我不推荐这样做。
在这种情况下,您似乎必须在 SQL 中编写一个存储过程以获得更好的性能。