Стремящаяся загрузка совокупных корней с помощью Entity Framework

StackOverflow https://stackoverflow.com/questions/987305

Вопрос

Я хотел бы создать более структурированный подход к загрузке необходимого дерева сущностей:

Мне нужен серьезный объем данных, поэтому я делаю это с помощью типобезопасных включений (обычное включение, но с лямбда-выражениями). как показано здесь.

Как я уже сказал, мне нужно много данных, по сути, целое дерево сущностей под одним родительским элементом.

Теперь я мог бы сделать это, выполнив что-то вроде:

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top