2012-01-09 11 views
6

Eksperymentuję z linq i generics. Na razie zaimplementowałem metodę GetAll, która zwraca wszystkie rekordy danego typu.Linq-to-entity, pytania ogólne i prekompilowane

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

Działa to dobrze. Następnie chciałbym precompile zapytania:

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

Tutaj pojawia się następujący:

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."} 

Na czym polega problem z tym? Domyślam się, że problem jest z wynikiem wykonania prekompilowanego zapytania, ale nie jestem w stanie przewidzieć dlaczego.

+0

Dlaczego uważasz, że potrzebujesz skompilowanej kwerendy dla tego? Nie potrzebujesz tego. –

+0

Nie związane z błędem; ale jeśli to * działało *, chciałbyś zrobić 'cqGetAll'' pole 'statyczne –

+0

@Jeff Mercado - Nie potrzebuję tego dla tej sprawy, ale planuję rozszerzyć to o bardziej złożone zapytania – loodakrawa

Odpowiedz

4

Miałem ten wyjątek, gdy użyłem metod wewnątrz kwerendy LINQ, które nie są częścią modelu encji. Problem polega na tym, że prekompilowane zapytanie nie może wywołać parametru CreateObjectSet dla typu TestEntity, ponieważ prekompilowane zapytanie nie jest częścią kontekstu używanego do wywoływania zapytania.

+0

Wygląda na to. Otrzymuję ten sam wyjątek podczas korzystania z prekompilowanych zapytań w połączeniu z CreateObjectSet. Oznacza to, że nie ma to nic wspólnego z rodzajami. – loodakrawa