【问题标题】:Force Parameterization of Entity Framework Order By实体框架顺序的强制参数化
【发布时间】:2014-06-06 08:29:32
【问题描述】:

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

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

有什么方法可以让 SQL 输出使用类似以下的 ORDER BY 子句:

ORDER BY [Foo].[@p__linq__24]

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

【问题讨论】:

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


【解决方案1】:

SQL Server 不接受 ORDER BY 的参数。

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

换句话说,只有当查询中的更改是微不足道的(例如更改过滤器的值)时,才会重新使用执行计划。即便如此,根据过滤值的统计和选择性,它可以决定以不同的方式进行。例如,想象一个位列,它有 999 行值为 0,1 列值为 1。如果统计信息正确更新,SQL Server 知道在该索引中按值 1 过滤是最佳的(极具选择性),并按0 毫无意义(几乎没有选择性)。

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

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

【讨论】:

  • 我不是在尝试优化 SQL 计划,而是强制实体框架对查询使用相同的 SQL 语句,而不管按属性的顺序如何。 Entity Framework 使用参数化的动态 SQL 语句来执行它的查询。这意味着 where 子句中的项目是传递给 sql 语句的参数。这些语句被缓存。这样就不必每次都将整个表达式树编译成sql。对于复杂的查询,这是一个巨大的性能提升。我正在寻找一种方法来参数化 order by 子句,其方式与 where 子句相同。
  • 即使你想做的是在 EF 端,order by 也不能参数化。您测量过“性能提升”还是只是在想象?您不应该担心性能,除非很明显存在严重的性能问题。您可以有兴趣阅读这篇关于 EF 优化的详尽文章:msdn.microsoft.com/en-US/data/hh949853,特别是 3.2.2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多