9

我有以下代码:

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”子句。

有趣的部分:

如果我做类似的事情但指定一个具体的 orderby:

return ctx.anEntity.OrderBy(x => x.aField).Skip(pagesize * page).Take(pagesize).ToList();

配置文件显示了一个漂亮的“TOP”子句。

我想避免有很多方法,每个“orderby”可能性都有一个。任何提示将不胜感激。

4

1 回答 1

13

那是因为您的orderby参数是函数而不是表达式。无法将任意函数转换为 SQL,因此在调用该函数之前,您的所有数据都必须位于客户端。

将参数类型更改为Expression<Func<anEntity, T>>,其中T是您应该添加到Get方法中的新通用参数,它将按预期工作。

当然,您将无法使用 custom IComparable,但没有办法解决这个问题:无法将自定义代码翻译成 SQL。

于 2012-10-03T14:06:26.853 回答