如何解决嵌套包含 Entity Framework Core
我在我的项目中使用 EF Core。我在 EF Core 中遇到嵌套查询问题。
我有两门课:
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 做到这一点吗?
解决方法
您需要递归加载放置在 PermissionGroupDefinitionEntity 中的 PermissionDefinition。
首先,您应该像以下查询一样加载所有 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)
{
}
}
然后在内部循环中你应该调用你的递归函数。 请参阅以下链接(在 Entity Framework Core 中递归获取所有子项的示例)
这种方式的性能很差,我不建议这样做。
在这种情况下,您似乎必须在 sql 中编写存储过程以获得更好的性能。
,你可以像这样使用.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();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。