Как я могу рекурсивно извлечь иерархию записей, используя EF Core? - PullRequest
0 голосов
/ 15 октября 2019

Я использую EF Core 2.1. У меня есть объект группы, который имеет следующие свойства:

  • int GroupId
  • int? ParentGroupId
  • Group ParentGroup

Объект ссылается на GroupId своего родителя, используя свойство ParentGroupId. Глубина иерархии неизвестна при запросе. Как я могу получить всю иерархию?

Я попробовал следующее, что даст мне три уровня глубины, но как я могу получить все уровни иерархии, не зная глубины? Нужно ли полагаться на сохраненный процесс?

var group = await _membershipDbContext.Groups
    .Include(g => g.ParentGroup)
        .ThenInclude(g => g.ParentGroup)
    .SingleOrDefaultAsync(g => g.GroupId == id);

1 Ответ

2 голосов
/ 15 октября 2019

У вас есть три варианта:

  1. Использовать отложенную загрузку. Таким образом, каждый раз, когда вы получаете доступ к родительской группе, она автоматически загружается из базы данных.
  2. Использовать явную загрузку для рекурсивной загрузки родительских групп (см. явная загрузка )
  3. Создайте представление или хранимую процедуру в базе данных, которая вернет все необходимые данные, а затем создайте граф объектов вручную.

Какой метод подходит вам, зависит от вашего уникального варианта использования иколичество данных для загрузки. Опции 1 и 2 не сильно отличаются друг от друга, но с помощью опции 2 вы контролируете, когда объекты загружаются. Вариант 3, вероятно, будет наиболее эффективным, но может создать проблемы при сохранении изменений (когда вы преобразуете граф объектов вручную).

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