简体   繁体   English

嵌套包含 Entity Framework Core

[英]Nested include Entity Framework Core

I'm using EF Core for my project.我正在为我的项目使用 EF Core。 And I have a problem with nested query in EF Core.我在 EF Core 中遇到嵌套查询问题。

I have 2 classes:我有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; }
}

and this is the ApplicationDbContext:这是 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);

I want query all PermissionGroupDefinitionEntity included PermissionDefinitionEntity and self referencing of PermissionDefinitionEntity .我想查询所有PermissionGroupDefinitionEntity包括PermissionDefinitionEntity和自我参照的PermissionDefinitionEntity

Can I do that with EF Core?我可以用 EF Core 做到这一点吗?

You need to load recursively PermissionDefinitions that placed in the PermissionGroupDefinitionEntity.您需要递归加载放置在 PermissionGroupDefinitionEntity 中的 PermissionDefinition。

First, you should load all PermissionGroupDefinitionEntities includes it's children like following query :首先,您应该加载所有 PermissionGroupDefinitionEntities 包括它的子项,如以下查询:

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

Since every PermissionGroupDefinitionEntity has a list of PermissionDefinition you need nested loops like following code :由于每个 PermissionGroupDefinitionEntity 都有一个 PermissionDefinition 列表,因此您需要嵌套循环,如以下代码:

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

    }
}

Then in the inner loop you should call your recursive function.然后在内部循环中,您应该调用递归函数。 See following link (Sample for Get all children recursively in Entity Framework Core)请参阅以下链接(在 Entity Framework Core 中递归获取所有子项的示例)

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

This way has terrible performance and I don't recommend that.这种方式的性能很差,我不建议这样做。

In this case it's seems you must write store procedure in sql for better performance.在这种情况下,您似乎必须在 sql 中编写存储过程以获得更好的性能。

You can use .ThenInclude(i => ...) like so你可以像这样使用.ThenInclude(i => ...)

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

Edit:编辑:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM