我用的数据仓储,我的查询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
参数要用 Expression<Func<T, bool>>,这样才是linq to ef
将Func用Expression包裹,Expression包裹后,会直接将WHERE条件放到数据库中查询,而Func会在内存中查询
public IQueryable<T> Query(Expression<Func<T, bool>> wherelambda)
{
return db.Set<T>().AsNoTracking<T>().Where<T>(wherelambda).AsQueryable();
}
宏观的解释是Expression内部是专门有个解析器privoder,会根据条件解析成相应sql并执行到数据库,而Func这个破委托类型没有这种专业的sql解析器,没法生成你想要的sql,直接是等默认全表加载后在内存中筛选。
我是这么粗略的理解,不到之处,请多多指教。
看到AsQueryable我就不说了,你Where返回不是Iqueryable吗?
现在我也遇到同样的问题,一看评论竟是15年的,惭愧,感谢各位大神的指导,你们就是我们这些菜鸟的指明灯;