Entity framework EF Core:计算实体的多级子级数

Entity framework EF Core:计算实体的多级子级数,entity-framework,entity-framework-core,Entity Framework,Entity Framework Core,我拥有以下实体: public class Entity { Guid Id { get; set; } Guid? ParentId { get; set; } virtual Entity Parent { get; set; } virtual ICollection<Entity> Children { get; set; } } 问题是,我需要将数字SelectManys增加到我拥有的最大儿童深度,这是不实际的。我觉得使用EntityFra

我拥有以下实体:

public class Entity {
    Guid Id { get; set; }
    Guid? ParentId { get; set; }
    virtual Entity Parent { get; set; }
    virtual ICollection<Entity> Children { get; set; }
}
问题是,我需要将数字
SelectMany
s增加到我拥有的最大儿童深度,这是不实际的。我觉得使用EntityFramework是不可能的,我必须使用SQL过程,但我想问一下,就是为了确保这一点


另外,我正在使用EF Core。

我找到了一个适合我的案例的解决方案,它是这样的:我在
实体
中添加了另一个属性;我称之为层次结构。其值可以是
000
001
002
,…,
00y
00z
010
,…,
zzy
,…,
zzz
。换句话说,它是一个3位数的base-62数字(但存储为字符串)。此外,子实体的
层次结构
将以其父实体的
层次结构
作为前缀。因此,例如,如果我们有一个父实体
ParentEntity
,其
层次结构
001
,其子实体
ChildEntity
,其
层次结构
000
,子实体的
层次结构
的最终值将是:
001000
。通过这种方式,如果我想让父母的孩子在各个级别上,我会这样做:

dbContext.Entities.Count(x => x.Hierarchy.StartsWith(parentEntity.Hierarchy))
此解决方案的限制是每个父项的子项数量有限,在本例中为62*62*62=238328。对于我的情况,这个数字已经足够了,但是可以通过增加
层次结构
字段的大小来增加,例如,4位数字而不是3位数字


当然,在更新实体时必须小心;每当实体的级别发生更改时,相应地更新
层次结构。此外,我还为数据库中的
层次结构
字段创建了一个索引,以加快搜索速度。

我制定了一个适用于我的案例的解决方案,如下所示:我向
实体添加了另一个属性
;我称之为层次结构。其值可以是
000
001
002
,…,
00y
00z
010
,…,
zzy
,…,
zzz
。换句话说,它是一个3位数的base-62数字(但存储为字符串)。此外,子实体的
层次结构
将以其父实体的
层次结构
作为前缀。因此,例如,如果我们有一个父实体
ParentEntity
,其
层次结构
001
,其子实体
ChildEntity
,其
层次结构
000
,子实体的
层次结构
的最终值将是:
001000
。通过这种方式,如果我想让父母的孩子在各个级别上,我会这样做:

dbContext.Entities.Count(x => x.Hierarchy.StartsWith(parentEntity.Hierarchy))
此解决方案的限制是每个父项的子项数量有限,在本例中为62*62*62=238328。对于我的情况,这个数字已经足够了,但是可以通过增加
层次结构
字段的大小来增加,例如,4位数字而不是3位数字


当然,在更新实体时必须小心;每当实体的级别发生更改时,相应地更新
层次结构。此外,我还为数据库中的
层次结构
字段创建了一个索引,以加快搜索速度。

这将很困难,因为您需要进行一次搜索。我不知道在实体框架上进行递归的简单方法。您必须将整行加载到内存中,然后从中走出来,如和所示。@BagusTesa有几种技术可以实现这一点,但问题是我想加载许多实体ID及其各自的计数。我希望能够使用最少数量的查询来实现这一点。我所知道的最佳策略是使用左值和右值,就像这里的地方:您必须编写自定义查询来检查左值和右值,因为EF无法在hieracy@ThomasKoelle谢谢,我看过了,这是一个有趣的方法,尽管如果层次结构需要更新,这将是一个挑战。我为此发布了一个解决方案,我想,在处理层次结构更新时,该解决方案的开销较小。这将是很困难的,因为您将需要执行一个任务。我不知道在实体框架上进行递归的简单方法。您必须将整行加载到内存中,然后从中走出来,如和所示。@BagusTesa有几种技术可以实现这一点,但问题是我想加载许多实体ID及其各自的计数。我希望能够使用最少数量的查询来实现这一点。我所知道的最佳策略是使用左值和右值,就像这里的地方:您必须编写自定义查询来检查左值和右值,因为EF无法在hieracy@ThomasKoelle谢谢,我看过了,这是一个有趣的方法,尽管如果层次结构需要更新,这将是一个挑战。我为此发布了一个解决方案,我想,在处理层次结构更新时,它的开销会更少。