我有以下代码:
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”可能性。任何提示都将非常感激。
答案 0 :(得分:13)
那是因为你的orderby
参数是一个函数而不是表达式。没有办法将任意函数转换为SQL,因此在调用该函数之前,所有数据都必须在客户端。
将参数类型更改为Expression<Func<anEntity, T>>
,其中T
是您应添加到Get
方法的新通用参数,它将按预期工作。
当然,您将无法使用自定义IComparable
,但无法解决此问题:自定义代码无法转换为SQL。