c# – 实体框架5执行全表扫描
发布时间:2020-12-15 04:12:08 所属栏目:百科 来源:网络整理
导读:我有以下代码: public ListanEntity Get(int page,int pagesize,FuncanEntity,IComparable orderby){ using (var ctx = new MyContext()) { return ctx.anEntity.OrderBy(orderby).Skip(pagesize * page).Take(pagesize).ToList(); } } 当我检查我的数据库
我有以下代码:
public List<anEntity> Get(int page,int pagesize,Func<anEntity,IComparable> orderby) { using (var ctx = new MyContext()) { return ctx.anEntity.OrderBy(orderby).Skip(pagesize * page).Take(pagesize).ToList(); } } 当我检查我的数据库配置文件(SqlServer 2012)时,我可以看到一个可怕的全表扫描,没有任何“TOP”子句. 有趣的部分: 如果我做类似的事情,但指定一个具体的顺序: return ctx.anEntity.OrderBy(x => x.aField).Skip(pagesize * page).Take(pagesize).ToList(); 该资料显示了一个美丽的“TOP”子句. 我想避免有很多方法,一种是针对每个“orderby”的可能性.任何暗示都将非常感激. 解决方法
这是因为你的orderby参数是一个函数而不是表达式.没有办法将任意函数转换为SQL,因此在调用该函数之前,所有数据必须位于客户端.
将参数类型更改为Expression< func< anEntity,T>>,其中T是您应该添加到Get方法的新通用参数,它将按预期工作. 当然,您将无法使用自定义的IComparable,但没有办法:自定义代码不能被翻译成SQL. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |