Linq-сущности, универсальные шаблоны и предварительно скомпилированные запросы

Я экспериментирую с linq и дженериками. На данный момент я только что реализовал метод GetAll, который возвращает все записи данного типа.

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

Это прекрасно работает. Затем я хотел бы предварительно скомпилировать запрос:

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

Здесь я получаю следующее:

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

В чем проблема? Я предполагаю, что проблема связана с результатом выполнения предварительно скомпилированного запроса, но я не могу понять, почему.

6
задан loodakrawa 9 January 2012 в 09:45
поделиться