2009-09-26 23 views
6

Sto usando Pattern Repository generico con metodi Pattern Repository:Entity Framework e di problem

private ObjectQuery<T> ObjectQueryList() 
    { 
     var list = CamelTrapEntities.CreateQuery<T>(EntitySetName); 
     return list; 
    } 

public IQueryable<T> List() 
    { 
     return ObjectQueryList(); 
    } 

Lista Metod() restituisce IQueryable < T >, becase IQueryable < T > è facile da prendere in giro. Ho anche metodo di estensione:

public static IQueryable<T> Include<T>(this IQueryable<T> obj, string path) 
    { 
     if (obj is ObjectQuery<T>) 
      (obj as ObjectQuery<T>).Include(path); 

     return obj; 
    } 

Questo metodo viene utilizzato al di fuori del repository per ottenere l'elenco un'entità con proprietà di navigazione già caricati, ad esempio: List.Include ("CreatedBy"). Il problema è che non funziona. Tutti gli include sono ignorati. quando cambio List() per

public ObjectQuery<T> List() 
    { 
     return ObjectQueryList(); 
    } 

tutto funziona bene.

Come devo implementare il modello di repository per poter eseguire query più complesse?

risposta

6

Reflector mi ha dato una risposta:

public ObjectQuery<T> Include(string path) 
{ 
    EntityUtil.CheckStringArgument(path, "path"); 
    return new ObjectQuery<T>(base.QueryState.Include<T>((ObjectQuery<T>) this, path)); 
} 

Includere rendimenti nuovo oggetto ObjectQuery e la mia Include la funzione restituito vecchio oggetto. Passaggio a

public static IQueryable<T> Include<T>(this IQueryable<T> obj, string path) 
{ 
    if (obj is ObjectQuery<T>) 
     return (obj as ObjectQuery<T>).Include(path); 

    return obj; 
} 

risolto il problema. Poche ore perse e odio Entity Framework di più :)

Mi ha fatto anche capire che dovrei creare un'altra funzione di lista con parametro Includi e non consentire di fare include repository esterni.

1

Here è l'implementazione del modello di repository più completa che ho visto per EF. Non posso dire con certezza se ti permetterà di fare Include(), ma se leggo correttamente l'implementazione dovrebbe.

1

Con EntityFramework 4.1, DbExtensions (System.Data.Entity.DbExtensions) risolve questo problema, e in modo nativo sia aggiunge .Include([string path]) e .Include([property expression]) per qualsiasi IQueryable<T>.

Accertarsi che il progetto che utilizza il repository faccia riferimento a EntityFramework e, come con qualsiasi metodo di estensione, specificare using System.Data.Entity; nel file di classe per accedere a queste estensioni.