Я разработал решение, которое работает для моего случая, вот оно: я добавил еще одно свойство к Entity
;Я назвал это Hierarchy
. Его значение может быть 000
, 001
, 002
, ..., 00y
, 00z
, 010
, ..., zzy
, ..., zzz
. Другими словами, это трехзначное число base-62 (но хранится в виде строки). Кроме того, Hierarchy
дочерней сущности будет иметь префикс Hierarchy
ее родительской сущности. Так, например, если у нас есть родительская сущность ParentEntity
с Hierarchy
из 001
, которая имеет дочернюю сущность ChildEntity
с Hierarchy
из 000
, конечное значение дочерней сущности для Hierarchy
будет:001000
. Таким образом, если я хочу получить детей родителей на всех уровнях, я просто сделаю это:
dbContext.Entities.Count(x => x.Hierarchy.StartsWith(parentEntity.Hierarchy))
Ограничением этого решения является ограниченное количество детей для каждого родителя, в данном случае это62 * 62 * 62 = 238,328. Этого числа более чем достаточно для моего случая, но его можно увеличить, увеличив размер поля Hierarchy
, например, 4-значное, а не 3-значное число.
Конечно, у вас естьбыть осторожным при обновлении сущностей;всякий раз, когда уровень объекта изменился, обновите Hierarchy
соответственно. Кроме того, я создал индекс для поля Hierarchy
в базе данных для более быстрого поиска.