2009-09-26 28 views
6

estoy usando el patrón repositorio genérico con métodos patrón de repositorio:Marco de la entidad y el problema

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

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

Lista Metod() devuelve IQueryable < T >, becase IQueryable < T > es fácil burlarse. También tengo método de extensión:

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; 
    } 

Este método se utiliza fuera del repositorio para obtener la lista entidad con propiedades de navegación ya cargados, por ejemplo: List.Include ("CreatedBy"). El problema es que no funciona. Todos los incluidos son ignorados. cuando cambio método de la lista() para

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

todo funciona bien.

¿Cómo debo implementar el patrón de repositorio para poder ejecutar consultas más complejas?

Respuesta

6

Reflector me dio una respuesta:

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

Incluir retornos nuevo objeto ObjectQuery y mi Incluir función devolvió objeto de edad. El cambio 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; 
} 

resuelto el problema. Pocas horas perdidas y odio Entity Framework más :)

Me hizo darme cuenta de que debería crear otra función de lista con el parámetro Incluir y no permitir que incluye un repositorio externo.

1

Here es la implementación de patrón de repositorio más completa que he visto para EF. No puedo decir con certeza si le permitirá hacer Include(), pero si leo correctamente la implementación, debería hacerlo.

1

Con ADO.NET Entity Framework 4.1, DbExtensions (System.Data.Entity.DbExtensions) resuelve este problema, y ​​de forma nativa tanto añade .Include([string path]).Include([property expression]) y para cualquier IQueryable<T>.

Solo asegúrese de que el proyecto que utiliza su repositorio haga referencia a EntityFramework y, como con cualquier método de extensión, especifique using System.Data.Entity; en su archivo de clase para obtener acceso a estas extensiones.

Cuestiones relacionadas