我正在尝试使用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."}
这有什么问题?我想问题是执行预编译查询的结果,但我无法想象为什么。
答案 0 :(得分:4)
当我在LINQ查询中使用不属于实体模型的方法时,我遇到了这个异常。问题是预编译的查询无法为类型CreateObjectSet
调用TestEntity
,因为预编译的查询不是用于调用它的上下文的一部分。