为什么EF将DateTime.Now转换为SQL Server时间而不是EF时间?

我有一个在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的时区?有没有一种方法可以防止第一个查询正常工作?

WO129876SHI 回答:为什么EF将DateTime.Now转换为SQL Server时间而不是EF时间?

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应格外小心,否则性能问题可能会让您失望。

本文链接:https://www.f2er.com/3084310.html

大家都在问