Я хотел бы создать более структурированный подход к загрузке необходимой сущности дерева:жадных загрузка агрегатных корней с Entity Framework
мне нужно серьезное количество данных, поэтому я делаю это с помощью типобезопасного Включает в себя (только нормальный Включить, но с Lambda's) as shown here.
Как я уже сказал, мне нужно много данных, в основном всего дерева объектов под одним родительским элементом.
Теперь, я мог бы сделать это делать что-то вроде:
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
Как вы можете видеть, эта строка заполнена включает в себя может быть довольно велик. На самом деле это очень упрощенный образец фактического кода (который не включает дома btw)
Так что я хотел бы создать методы, отвечающие за его ветку в дереве. Если метод может принять объектный запрос и включить его, и в свою очередь, вызовите «методы дочернего загрузчика». Кроме того, родительский элемент не должен иметь значения, если он имеет свойство с типом дочернего элемента.
Это, вероятно, не имеет большого смысла так:
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, конечно, метод LoadDoors знает это выражение? –
Я также не вижу, как изменение void для возврата запроса является решением этого. Afterall, запрос приходит в byref, поэтому все, что я делаю с ним в методе, будет выполнено. – Bertvan
@Bertvan потому что ReferenceEquals (q, q.Include ("Foo")) == false –