通用EF6存储库方法不会生成正确的SQL

时间:2016-08-09 17:25:55

标签: c# sql-server entity-framework

我在我的存储库中使用此方法公开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子句。

有什么想法吗?

2 个答案:

答案 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