Я хотел бы создать более структурированный подход к загрузке необходимого дерева сущностей:
Мне нужен серьезный объем данных, поэтому я делаю это с использованием безопасных по типу включений (просто обычное включение, но с лямбда-символами) , как показано здесь .
Как я уже сказал, мне нужно много данных, в основном целое дерево сущностей под 1 родительским элементом.
Теперь я могу сделать что-то вроде:
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(...)
}
И так далее. Но я никак не могу разобраться с этим ... Отсутствует связь между входящим запросом и вызовом дочерних методов.
Кто-нибудь делал что-то подобное? Или кто-нибудь может дать мне несколько советов?