实体框架顺序的力参数化

时间:2014-06-05 15:43:43

标签: .net entity-framework entity-framework-6

我正在使用类似于DynamicLinq的东西来允许Entity Framework结果按照与属性名称对应的字符串进行排序。但是,似乎每当更改sort属性时,都不使用缓存的SQL,而是生成新的语句。我正在寻找的是一种让Entity Framework在它生成的SQL语句中为ORDER BY子句使用SQL参数的方法。

我能够用.Skip()和.Take()方法克服类似的问题。那么对应的SELECT TOP N和WHERE ROW_NUMBER> M在SQL输出中正确参数化。

有没有办法让SQL输出使用类似的ORDER BY子句:

ORDER BY [Foo].[@p__linq__24]

从SQL的角度来看,这应该是可能的。

1 个答案:

答案 0 :(得分:0)

SQL Server不接受ORDER BY的参数。

但是,除了这个细节之外,更重要的是:当要执行查询时,SQL Server会创建最佳查询执行计划。执行此操作时,它决定使用哪些索引,如何过滤行,如何组合表等。并且改变结果的顺序并不是那么简单,以至于期望先前的执行计划仍然有效(例如,它可以决定使用不同的索引)。

换句话说,只有在查询中的更改很简单时(例如更改过滤器的值),才会重复使用执行计划。即便如此,根据过滤值的统计和选择性,它可能决定以不同的方式进行。例如,假设一个位列有999行,值为0,1列有值1.如果统计信息被正确更新,SQL服务器知道值1的过滤在此索引中是最佳的(非常有选择性),并且过滤0毫无意义(几乎没有选择性)。

除非您遇到需要优化的极端情况,否则不要担心。

您可以自己进行测试,检查SSMS中的“显示查询执行计划”并查看执行计划(真实计划,而非强制执行计划......我不知道英文的确切措辞,我已经得到了本地化的SSMS)。