繁体   English   中英

LINQ to EF4日期时间比较问题

[英]LINQ to EF4 datetime comparison problems

将DB(SQL Server 2008)中的smalldatetime / datetime列值与C#中的DateTime.Now进行比较时遇到问题。 我知道数据库和运行应用程序的服务器上的日期时间格式是不同的,因此我已经做了类似的事情来“缓存”结果,因此日期时间比较将是本地的,而不是在服务器上:

var inactiveAccounts = (from entry in ent.Accounts
                           where entry.Status == 0                                           
                           select entry).ToArray();

var accountsFiltered = (from entry in inactiveAccounts
                     where entry.DeactivationDate < DateTime.Now
                     select entry).ToArray(); 

有时候,我没有得到正确的记录。

我怀疑这是由于entry.DeactivationDate <DateTime.Now日期比较。 在EF中使用日期时间似乎很棘手,请帮助我确定问题所在。

不知道它是否可以解决您的问题,但我会创建一个局部变量并在其上设置DateTime.Now 然后在linq查询中使用局部变量。

这样做是因为每次调用where子句时都会在查询中对DateTime.Now进行求值。 因此,对于inactiveAccounts中的每个条目,您正在使用另一个DateTime。

另外,如果要比较没有时间值的日期,则应使用DateTime.Today

var inactiveAccounts = (from entry in ent.Accounts
                       where entry.Status == 0                                           
                       select entry).ToArray();

DateTime currentDateTime = DateTime.Now;

var accountsFiltered = (from entry in inactiveAccounts
                 where entry.DeactivationDate < currentDateTime 
                 select entry).ToArray(); 

您可以直接使用:

var inactiveAccounts = (from entry in ent.Accounts
                        where entry.Status == 0 && entry.DeactivationDate < DateTime.Now                  
                        select entry).ToArray();

因为DataTime.NowDateTime.UtcNow被转换为规范函数 =不应在.NET端对其进行求值,而应分别转换为GETDATE()GETUTCDATE() SQL函数调用。

您的其余问题无法回答,因为提供了以下信息

在某些时候,我没有得到正确的记录。

如果要获得答案,包括哪个时期导致问题,使用了哪个时区等,您必须付出更大的努力来分析问题。通常,我们不会帮助您,因为我们看不到您的数据。 这也不是EF的问题,因为在您的情况下,它完全发生在linq-to-object =普通的.NET代码中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM