实体框架生成没有where子句的SQL查询

时间:2012-05-07 19:23:38

标签: c#-4.0 entity-framework-4

在我的一个数据访问类中使用Entity Framework 4.3我有一个像这样的函数

    public List<Company> Query(Func<Company, bool> expression)
    {
        return MyDbContext.Instance().Company.Where(expression).ToList();
    }

我在bussines图层类中使用它作为MyDAL.Query(a =&gt; a.Name.Contains(textToSearch))。

尽管forEntity Framework返回了正确的结果,但我不知道为什么它而不是生成一个带有Where子句的Sql查询语句,如“where name like'%'+ textToSearch +'%'”,它生成一个sql查询语句没有where子句查询所有表行。显然这是非常有用的。

另一方面,如果在我的数据访问条款中我写了这样的方法:

    public List<Company> GetLikeName(string textToSearch)
    {
        return MyDbContext.Instance().Company.Where(a => a.Contains(textToSearch)).ToList();
    }

它正确生成一个带有where子句的Sql。

为什么如果我使用我的通用查询从数据库中检索结果,指定要从我的商务类查询的表达式,它会生成一个没有where子句的Sql语句?

由于

1 个答案:

答案 0 :(得分:4)

您需要将表达式参数作为Expression<>传递:

public List<Company> Query(Expression<Func<Company, bool>> expression)

如果您只是传递Func<>,则会调用IEnumerable.Where而不是IQueryable.Where,它会在代码中运行,而不是在SQL中运行。