我正在使用类似于DynamicLinq的东西来允许实体框架结果按照与属性名称相对应的字符串进行排序。但是,似乎只要更改排序属性,就不会使用缓存的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的角度来看,这应该是可能的。
发布于 2014-06-06 08:29:32
SQL Server不接受ORDER BY的参数。
但是,除了这个细节之外,更重要的是:当要执行查询时,SQL server会创建最优的查询执行计划。并且,更改结果的顺序并不是那么简单,以至于期望先前的执行计划仍然有效(例如,它可以决定使用不同的索引)。
换句话说,只有当查询中的更改微不足道(如更改筛选器的值)时,才会重用执行计划。例如,假设bit colum有999行,值为0,有1列,值为1。如果统计信息更新正确,SQL server就会知道,在此索引中,按值1进行筛选是最佳的(极具选择性),而按0进行筛选是没有意义的(几乎没有选择性)。
除非你真的需要优化的极端情况,否则不用担心这一点。
您可以进行自己的测试,检查SSMS中的“显示查询执行计划”,并查看执行计划(真正的执行计划,而不是混合的执行计划)。我不知道英文的确切措辞,我有本地化的SSMS)。
https://stackoverflow.com/questions/24064565
复制相似问题