使用日期时间比较的 Linq 查询未按预期工作
本文关键字:工作 查询 Linq 日期 时间 比较 | 更新日期: 2023-09-27 18:32:55
大约在 2014/12/1 21:40:12 PM,以下代码检索空值。
Campaign camp = repo.Campaigns
.Where(ca => ca.StartTime <= DateTime.Now)
.Where(ca => ca.EndTime >= DateTime.Now)
.FirstOrDefault();
当数据库中存在具有以下值的广告系列时:
Start Time:
2014-11-30 00:00:00.000
End Time:
2014-12-02 00:00:00.000
我完全不知为什么会发生这种情况。
试试这个:
Campaign camp = repo.Campaigns
.Where(ca => ca.StartTime.Value.Date <= DateTime.Now.Date && ca.EndTime.Value.Date >=DateTime.Now.Date).FirstOrDefault();
您是否考虑了时区信息?数据库中存储的数据可能是从运行在另一个时区的计算机创建的,您的 DateTime 对象将具有另一个时区,当它们传递到数据库时,它们可能会超过 EndTime。
您的代码在处理内存中数据时有效,因此问题可能与时区有关。
要评论其他内容:1.不要链接多个.哪里子句,你可以用一个来做。2. 不要使用 DateTime.Now,将 DateTime.Now 存储在一个值中,然后将其传递到 LINQ 中,否则将针对两个不同的值比较 StartTime 和 EndTime。
var now = DateTime.Now;
Campaign camp = repo.Campaigns
.Where(ca => ca.StartTime <= now && ca.EndTime >= now)
.FirstOrDefault();
您首先选择的日期时间小于当前值。假设您有 2 个结果。接下来,对于这两个结果,您将查询超过当前值的日期时间!结果小于当前日期,因此显然它们永远不会超过当前日期值。我猜您正在尝试执行以下操作:
Campaign camp = repo.Campaigns
.Where(ca => ca.StartTime.Value.Date <= DateTime.Now.Date **||** ca.EndTime.Value.Date >=DateTime.Now.Date).FirstOrDefault();
之所以
发生这种情况,是因为您比较的时间(如"开始时间"和"结束时间")的日期格式与"日期时间"的区域性不同。现在正在选取
**
DateTime.Now- 12/1/2014 9:40:12 PM
Start Time: 2014-11-30 00:00:00.000
End Time: 2014-12-02 00:00:00.000
**
更改日期时间。现在日期格式与"开始时间"和"结束时间"的格式相同即 2014-12-01 9:40:12 下午
然后比较我相信你会得到结果