Linq-to-entity, Generics и Precompiled Queries - PullRequest
6 голосов
/ 09 января 2012

Я экспериментирую с 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."}

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

1 Ответ

4 голосов
/ 09 января 2012

У меня было это исключение, когда я использовал внутри запроса LINQ методы, которые не являются частью сущностной модели. Проблема в том, что предварительно скомпилированный запрос не может вызвать CreateObjectSet для типа TestEntity, потому что предварительно скомпилированный запрос не является частью контекста, который используется для его вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...