首页 新闻 会员 周边 捐助

EF写linq的时候,生成的SQL不带where条件,给全表都查出来的,请问这是什么原因

0
悬赏园豆:50 [已解决问题] 解决于 2016-07-21 13:07

我用的数据仓储,我的查询linq如下:

//查询

public IQueryable<T> Query(Func<T, bool> wherelambda)
{
return db.Set<T>().AsNoTracking<T>().Where<T>(wherelambda).AsQueryable();
}

我的linq是调用该查询方法,但是通过ef sql拦截生成的SQL是全表扫描,而通过监测 sql profile生成的sql也是不带SQL

EF
Dark_liu的主页 Dark_liu | 初学一级 | 园豆:127
提问于:2015-06-02 09:19
< >
分享
最佳答案
0

参数要用 Expression<Func<T, bool>>,这样才是linq to ef

收获园豆:50
Qlin | 老鸟四级 |园豆:2403 | 2015-06-02 09:21
其他回答(4)
0

将Func用Expression包裹,Expression包裹后,会直接将WHERE条件放到数据库中查询,而Func会在内存中查询

public IQueryable<T> Query(Expression<Func<T, bool>> wherelambda)
{
return db.Set<T>().AsNoTracking<T>().Where<T>(wherelambda).AsQueryable();
}

Dark_liu | 园豆:127 (初学一级) | 2015-06-02 09:38
3

宏观的解释是Expression内部是专门有个解析器privoder,会根据条件解析成相应sql并执行到数据库,而Func这个破委托类型没有这种专业的sql解析器,没法生成你想要的sql,直接是等默认全表加载后在内存中筛选。

我是这么粗略的理解,不到之处,请多多指教。

隔壁老王来了 | 园豆:99 (初学一级) | 2015-06-02 09:49
0

看到AsQueryable我就不说了,你Where返回不是Iqueryable吗?

爱编程的大叔 | 园豆:30844 (高人七级) | 2015-06-02 12:03
0

现在我也遇到同样的问题,一看评论竟是15年的,惭愧,感谢各位大神的指导,你们就是我们这些菜鸟的指明灯;

圣叹&北京 | 园豆:202 (菜鸟二级) | 2017-10-11 11:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册