【问题标题】:Why does EF convert DateTime.Now to SQL Server time rather than EF time?为什么 EF 将 DateTime.Now 转换为 SQL Server 时间而不是 EF 时间?
【发布时间】:2019-11-17 23:32:23
【问题描述】:

我有一个在 UTC 时区运行的 Azure SQL Server 数据库,以及一个在 EST 时区运行的 C# EF WebApi。

不能选择更改 SQL Server 时区或 WebApi 的时区。

在此查询中,EF 使用的是 SQL Server 的 DateTime.Now 值:

var results = db.Table1.Where(t => t.PublishedDate < DateTime.Now)

在此查询中,EF 使用 DateTime.Now 的 WebApi 值:

var now = DateTime.Now;
var results = db.Table1.Where(t => t.PublishedDate < now)

第二个查询根据 WebApi 的时区返回正确的结果。

在第一个示例中,为什么 EF 将 DateTime.Now 解释为 SQL Server 的时区?有没有办法阻止这种情况,使第一个查询正常工作?

【问题讨论】:

  • 第一个示例将使用 DateTime.Now 的表达式传递给 SQL 服务器以转换为 SysDateTime()。第二个示例只是传递一个 DateTime 变量,因此 EF 会将日期文字传递给 SQL。

标签: sql-server entity-framework datetime


【解决方案1】:

EF 有一个翻译来理解DateTime.Now 属性是什么,所以它将翻译成SQL。使用将转换为SysDateTime() 的 SQL Server,这将导致 SQL Server 使用服务器本地时间。

如果您将 DateTime.Now 捕获到 DateTime 变量中,那么 EF 会将其视为与任何其他日期文字没有什么不同,因此您可以传递应用程序服务器本地日期时间或 UTC 等。

请注意,如果您尝试以下操作:

var results = db.Table1.Where(t => t.PublishedDate < DateTime.Now.ToLocalTime());

var results = db.Table1.Where(t => t.PublishedDate < DateTime.Now.ToUniversalTime());

强制本地时间与通用时间 EF (6) 将引发异常,因为 DateTime.Now 上的这些方法无法转换为 SQL。 EF Core 可以通过执行减去此表达式的 SQL 来适应这些方法,然后在内存中应用该表达式,因此在使用 EF Core 时应小心谨慎,否则性能问题可能会让您不知所措。

【讨论】:

  • 谢谢,有什么办法可以防止 EF 将 DateTime.Now 转换为 SysDateTime()?
  • 是的。只需声明一个局部变量并将其分配给时间,然后在查询中使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 2016-09-17
  • 2016-12-22
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多