EF Core: подсчет количества многоуровневых дочерних объектов - PullRequest
1 голос
/ 30 сентября 2019

У меня есть следующая сущность:

public class Entity {
    Guid Id { get; set; }
    Guid? ParentId { get; set; }
    virtual Entity Parent { get; set; }
    virtual ICollection<Entity> Children { get; set; }
}

Учитывая определенный идентификатор сущности: theId, я хочу подсчитать количество его детей, его детей, детей его детей и т. Д.

Один наивный способ сделать это заключается в следующем:

var count = dbContext.Where(x => x.Id == theId)
    .SelectMany(x => x.Children)
    .SelectMany(x => x.Children)
    .SelectMany(x => x.Children)
    .SelectMany(x => x.Children)
    .SelectMany(x => x.Children)
    .Count();

Проблема заключается в том, что мне нужно увеличить число SelectMany s до максимальной глубины моих детей, которая равнане практично. Я чувствую, что это невозможно с помощью EntityFramework, и я должен использовать процедуры SQL, но я хотел попросить просто убедиться в этом.

PS Я использую EF Core.

1 Ответ

0 голосов
/ 30 сентября 2019

Я разработал решение, которое работает для моего случая, вот оно: я добавил еще одно свойство к 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 в базе данных для более быстрого поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...