2009-06-12 1 views
3

Я хотел бы создать более структурированный подход к загрузке необходимой сущности дерева:жадных загрузка агрегатных корней с 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(...) 


} 

И так далее. Но я не могу об этом обойти ... Отсутствует связь между входящим запросом и вызовом дочерних методов.

Кто-нибудь сделал что-то подобное? Или кто-нибудь может дать мне несколько указателей?

ответ

2

Попробуйте что-то вроде этого: вместо

запрос = LoadDoors (запрос, х => x.Door);

Где LoadX возвращает результат вызова Include.

+0

Я не понимаю, что нужно передать в выражение методу LoadDoors, конечно, метод LoadDoors знает это выражение? –

+1

Я также не вижу, как изменение void для возврата запроса является решением этого. Afterall, запрос приходит в byref, поэтому все, что я делаю с ним в методе, будет выполнено. – Bertvan

+0

@Bertvan потому что ReferenceEquals (q, q.Include ("Foo")) == false –

Смежные вопросы