2009-06-12 7 views
3

Je voudrais créer une approche plus structurée pour charger l'entité nécessaire arbre:Eager Chargement des racines globales avec Entity Framework

je besoin d'une quantité grave de données, donc je le fais en utilisant le type de sécurité Comprend (juste une inclusion normale, mais avec Lambda) as shown here. Comme je l'ai dit, j'ai besoin de beaucoup de données, essentiellement un arbre d'entité entier sous 1 élément parent.

Maintenant, je pouvais faire quelque chose à faire comme: Comme vous pouvez le voir

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 

, cette ligne remplie comprend peut être assez énorme. C'est en fait un échantillon très simplifié du code réel (qui n'inclut pas les maisons btw)

Donc ce que je voudrais faire est de créer des méthodes, responsable de sa branche dans l'arbre. Où la méthode peut accepter la requête d'objet et inclure l'enfant, et à son tour, appelez les "méthodes child-loader". En outre, le parent ne devrait pas importer, tant qu'il a une propriété avec le type de l'enfant.

Cela n'a probablement pas beaucoup de sens si:

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(...) 


} 

Et ainsi de suite. Mais je n'arrive pas vraiment à comprendre ... Il y a un chaînon manquant entre la requête entrante et l'appel des méthodes enfant.

Est-ce que quelqu'un a fait quelque chose comme ça? Ou pourrait-on me donner des indications?

Répondre

2

Essayez quelque chose comme ceci:

requête = LoadDoors (requête, x => x.Door);

Où LoadX renvoie le résultat de l'appel Include.

+0

Je ne comprends pas le besoin de passer l'expression à la méthode LoadDoors, la méthode LoadDoors connaît sûrement cette expression? –

+1

Je ne vois pas non plus comment changer void pour retourner une requête est une solution à cela. Après tout, la requête arrive en byref, donc tout ce que je ferai dans la méthode sera fait. – Bertvan

+0

@Bertvan parce que ReferenceEquals (q, q.Include ("Foo")) == false –

Questions connexes