使用DateTime比较的Linq查询未按预期工作

时间:2014-12-02 05:47:40

标签: c# sql-server linq datetime

在大约12/1/2014 9: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

我完全失去了为什么会这样。

4 个答案:

答案 0 :(得分:0)

试试这个:

Campaign camp = repo.Campaigns
            .Where(ca => ca.StartTime.Value.Date <= DateTime.Now.Date && ca.EndTime.Value.Date >=DateTime.Now.Date).FirstOrDefault(); 

答案 1 :(得分:0)

您是否考虑过时区信息?数据库中存储的数据可能是从另一个时区运行的计算机创建的,您的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 :(得分:0)

您首先选择的DateTime小于当前值。假设你有2个结果。接下来对于这两个结果,您要查询的DateTime大于当前值!结果小于当前日期,因此显然它们永远不会超过当前的日期值。我想你正在努力做到以下几点:

Campaign camp = repo.Campaigns
        .Where(ca => ca.StartTime.Value.Date <= DateTime.Now.Date **||** ca.EndTime.Value.Date >=DateTime.Now.Date).FirstOrDefault(); 

答案 3 :(得分:-1)

这种情况正在发生,因为您比较 StartTime EndTime 的时间与文化 DateTime的日期格式不同。现在正在接受

**

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

**

将您的Datetime.Now日期格式更改为相同格式,因为 StartTime EndTime 是 即 2014-12-01 9:40:12 PM

然后比较我相信你会得到结果