我有一个在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的时区?有没有一种方法可以防止第一个查询正常工作?
答案 0 :(得分:0)
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应格外小心,否则性能问题可能会让您失望。