@ya_tvoya_mamka

Какой лучший алгоритм/подход для прохода по древовидной структуре используя EntityFramework?

Всем доброго времени суток. Имеется следующая структура:
5dee6d0b4069d149292317.png
Т.е. в таком виде данные хранятся в базе и такая же древовидная модель должна прийти пользователю на UI. Сооствественно цель: пройти по этой структуре и создать на основании её модель.
На данный момент это делается максимально топорно: для каждой энтити(таблицы) создан отдельный маппер и всё это получается примерно так:
var entity = _entityRepository.Table.FirstOrDefault(x => x.Id == id);
var viewModel = _entityBuilder.BuildViewModel(entity);

Внутри этого билдера происходит следующее:
var model = new ViewModel();
model.ChildEntitiesA = entity.ChildEntitiesA.Select(childEntityA => childEntityABuilder.BuildViewModel(childEntityA));

///childEntityABuilder
modelChildEntityA.ChildEntitiesB = childEntityA.ChildEntitiesB.Select(childEntityB => childEntityBBuilder.BuildViewModel(childEntityB));

И так далее до конца всей иерархии.
Насколько я понимаю, если убрать все мапперы и посмотреть на картину воедино, то получается:
foreach(var childEntityA in entity.childEntitiesA){
 foreach(var childEntityB in childEntityA.ChildEntitiesB){
   foreach(var childEntityC in childEntityB.ChildEntitiesC)
    {
       //..и тд и тп.
    }
}
}

Что на мой взляд, слегка неправильно. Ухудшает ситуацию EF, когда на каждую childEntity делается отдельный запрос в базу, т.к. используется lazy-loading. В сумме для составления одной viewModel к базе делается под сотню(если не больше) запросов. Данных много и это работает ну просто ооооооочень медленно.
Собственно вопрос: есть ли какой-нибудь красивый способ обойти всю эту иерархию и минимизировать кол-во итераций/запросов?
Буду рад уточняющим вопросам, если таковы появятся.
Спасибо.
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 1
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Попробуйте вот этот подход
https://entityframework.net/knowledge-base/4853797...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы