2012-01-09 21 views
6

Estoy experimentando con linq y genéricos. Por ahora, acabo de implementar un método GetAll que devuelve todos los registros del tipo dado.Linq-to-entities, Generics and Precompiled Queries

class BaseBL<T> where T : class 
{ 
    public IList<T> GetAll() 
    { 
     using (TestObjectContext entities = new TestObjectContext(...)) 
     { 
      var result = from obj in entities.CreateObjectSet<T>() select obj; 
      return result.ToList(); 
     } 
    } 
} 

Esto funciona bien. A continuación, me gustaría precompilar la consulta:

class BaseBL<T> where T : class 
{ 
    private readonly Func<ObjectContext, IQueryable<T>> cqGetAll = 
    CompiledQuery.Compile<ObjectContext, IQueryable<T>>(
     (ctx) => from obj in ctx.CreateObjectSet<T>() select obj); 

    public IList<T> GetAll() 
    { 
     using (TestObjectContext entities = new TestObjectContext(...)) 
     { 
      var result = cqGetAll.Invoke(entities); 
      return result.ToList(); 
     } 
    } 
} 

Aquí, me sale el siguiente:

base {System.Exception} = {"LINQ to Entities does not recognize the method 
'System.Data.Objects.ObjectSet`1[admin_model.TestEntity] CreateObjectSet[TestEntity]()' 
method, and this method cannot be translated into a store expression."} 

¿Cuál es el problema con esto? Supongo que el problema es con el resultado de la ejecución de la consulta precompilada, pero no puedo decir por qué.

+0

¿Por qué crees que necesitas una consulta compilada para eso? No lo necesitas. –

+0

No relacionado con el error; pero si * lo * funcionó, querrá hacer 'cqGetAll' un campo' estático' –

+0

@Jeff Mercado - No lo necesito para este caso, pero planeo expandir esto con consultas más complejas – loodakrawa

Respuesta

4

Tuve esta excepción cuando utilicé métodos dentro de la consulta LINQ que no son parte del modelo de entidad. El problema es que la consulta precompilada no puede invocar el CreateObjectSet para el tipo TestEntity porque la consulta precompilada no forma parte del contexto que se utiliza para invocarla.

+0

Parece que sí. Obtengo la misma excepción cuando uso consultas precompiladas en combinación con CreateObjectSet. Eso significa que esto no tiene nada que ver con los genéricos. – loodakrawa