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谢谢,我看过了,这是一个有趣的方法,尽管如果层次结构需要更新,这将是一个挑战。我为此发布了一个解决方案,我想,在处理层次结构更新时,它的开销会更少。