实体框架5执行全表扫描

时间:2012-10-03 14:03:03

标签: c# entity-framework entity-framework-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”可能性。任何提示都将非常感激。

1 个答案:

答案 0 :(得分:13)

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

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

当然,您将无法使用自定义IComparable,但无法解决此问题:自定义代码无法转换为SQL。