【问题标题】:Force LINQ to SQL or ENTITIES to emit BETWEEN operator强制 LINQ to SQL 或 ENTITIES 发出 BETWEEN 运算符
【发布时间】:2015-01-04 17:14:45
【问题描述】:

在处理作为聚集索引的 SQL Server 和日期时,为了正确访问索引,查询必须采用以下形式:

select fields
  from dbo.MyTable
 where myDate between @begDate and @endDate

between 运算符是触发集群查找的原因。如何告诉 LINQ 发出 between 运算符而不是 >= this 和

【问题讨论】:

  • 您是否见过 BETWEEN 和 >=/
  • 不一定是不同的计划。最终发生的事情称为参数嗅探。
  • 它可能不是 EF 的一部分。 But this article might help you implement it yourself。或者,对于需要优化的查询,您可能会考虑根本不使用 EF - 使用存储过程,Dapper.Net,或者只是简单的原始 ADO。
  • @GeorgeMauer,我建议将其发布为答案;)

标签: sql linq entity-framework


【解决方案1】:

不幸的是,Linq 没有 between 运算符或等效运算符。实现这一目标的最佳(也可能)唯一方法是在 sql 中。

如果您要编写复杂或优化的查询,最好使用 sql 而不是 linq。这样做的主要优点是:

  • 可以在 Management Studio 中对代码进行全面测试,而无需翻译和调试第二语言
  • 出于遗留目的,通常最好将 sql 用于数据库访问代码,因为这在数据库专家中更广为人知。 LINQ 是 DBA 的诅咒,他们必须管理/支持其他人编写的代码。

我同意 Gerge Mauer 关于使用存储过程或 ADO 的建议。

这可能仍然会给您留下参数嗅探的问题,在这种情况下,您可能必须使用查询提示(例如 OPTIMIZE FOR / RECOMPILE)或局部变量来解决此问题,如本文所示:

http://blogs.msdn.com/b/turgays/archive/2013/09/10/parameter-sniffing-problem-and-workarounds.aspx

【讨论】:

  • 值得注意的是,您可以将存储过程插入 ORM 并仍然使用 ORM 提供的其他好处,例如实体化实体、启用对这些实体的延迟加载、更改跟踪等。
  • 我不同意将 sql 用于数据库代码。这是一个非常古老的争论,我相信你知道所有的论点,但是,作为一个全栈开发人员,我非常不鼓励 DBA 让他们肮脏的手接触我的应用程序数据库。它是应用程序的一部分,没有人也应该没有任何东西。带外修改它类似于不安全地重写部分内存。话虽如此,sql 绝对有一席之地,这与任何一个都一样合理。 Dapper.Net 也非常适合这类事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多