c# – 实体框架5执行全表扫描

我有以下代码
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.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...