Linq-to-entities,Generics和Precompiled Queries

时间:2012-01-09 09:45:52

标签: c# generics linq-to-entities

我正在尝试使用linq和generics。现在,我刚刚实现了一个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 个答案:

答案 0 :(得分:4)

当我在LINQ查询中使用不属于实体模型的方法时,我遇到了这个异常。问题是预编译的查询无法为类型CreateObjectSet调用TestEntity,因为预编译的查询不是用于调用它的上下文的一部分。