Стремящаяся загрузка совокупных корней с помощью Entity Framework
-
13-09-2019 - |
Вопрос
Я хотел бы создать более структурированный подход к загрузке необходимого дерева сущностей:
Мне нужен серьезный объем данных, поэтому я делаю это с помощью типобезопасных включений (обычное включение, но с лямбда-выражениями). как показано здесь.
Как я уже сказал, мне нужно много данных, по сути, целое дерево сущностей под одним родительским элементом.
Теперь я мог бы сделать это, выполнив что-то вроде:
context.House
.Include(x => x.Doors)
.Include(x => x.Doors.FirstOrDefault().Joint)
.Include(x => x.Doors.FirstOrDefault().Joint.FirstOrDefault().JointCategory)
.Include(x => x.Doors.FirstOrDefault().Joint.FirstOrDefault().JointCategory.JointType)
.Include(x => x.Windows)
// ... same thing
.Include(x => x.Roof)
// ... same thing
Как видите, эта строка, заполненная включениями, может стать довольно огромной.На самом деле это очень упрощенный образец реального кода (кстати, он не включает дома)
Итак, что я хотел бы сделать, так это создать методы, отвечающие за свою ветвь в дереве.Где метод может принять запрос объекта и включить дочерний элемент, а в свою очередь вызвать «методы дочернего загрузчика».Кроме того, родительский элемент не должен иметь значения, если у него есть свойство с типом дочернего элемента.
Вероятно, это не имеет особого смысла, поэтому:
public void LoadHouse(int id)
{
// ...
ObjectQuery<House> query = context.House;
// and now?
LoadDoors(query, x => x.Door);
}
public void LoadDoors<T>(ObjectQuery<T> query, ..?..)
{
// ... ?
LoadJoints(...)
}
И так далее.Но я никак не могу уложить в этом голову...Между входящим запросом и вызовом дочерних методов отсутствует связь.
Кто-нибудь делал что-то подобное?Или может кто-нибудь дать мне несколько советов?
Решение
Вместо этого попробуйте что-нибудь вроде этого:
запрос = LoadDoors (запрос, x => x.Door);
Где LoadX возвращает результат вызова Include.