我在我的存储库中使用此方法公开EF6 DbContext。
public IList<T> GetEntities<T>(Func<T, bool> predicate) where T : class
{
return db.Set<T>().Where(predicate).ToList<T>();
}
当我在SQL事件探查器中看到此方法执行时,谓词在内存中执行。 SQL语句不包含where子句。
有什么想法吗?
答案 0 :(得分:3)
.Where
接受以下两项内容之一:Func<T, bool>
或Expression<Func<T, bool>>
。如果您传入Expression<Func<T, bool>>
,那么您的EF查询应该可以正常运行。
public IList<T> GetEntities<T>(Expression<Func<T, bool>> predicate) where T : class
你会以同样的方式称呼它:
GetEntities(x => x.Id == 34)
传入Func<T, bool>
时,执行IEnumerable<T>
实现,它使用Linq-to-Objects而不是Linq-to-Entities。
答案 1 :(得分:2)
您的谓词应该是Func
,以便实体框架实际上可以使用它来生成SQL而不是仅执行它。如果您传入public IList<T> GetEntities<T>(Expression<Func<T, bool>> predicate) where T : class
{
return db.Set<T>().Where(predicate).ToList<T>();
}
,则实际上是在调用Enumerable.Where
方法,而不是Queryable.Where
:
coords