Linq DateTime比较不起作用

时间:2013-07-19 19:46:20

标签: linq

我有以下代码:

        DateTime timeStamp = Convert.ToDateTime(Request.QueryString["TimeStamp"]);

        var result = (from rs in db.VRec
                      where               
                      rs.TimeStamp == timeStamp && 
                      rs.Fixure == wFixture
                      select rs).ToList();

即使传递了正确的timeStamp,结果仍显示为0。

如果我删除了我进行TimeStamp比较的部分:

   rs.TimeStamp == timeStamp

代码工作正常。

有关为什么日期时间比较可能不起作用的任何想法?

3 个答案:

答案 0 :(得分:2)

DateTime具有非常好的分辨率 - 您可能正在比较仅以毫秒为单位的时间戳,这将失败。你可能想要这样的东西:

DateTime now = DateTime.Now;
DateTime then = now.Add(TimeSpan.FromMilliseconds(1));

const int EPSILON_MS = 10;
if(now.Subtract(then).TotalMilliseconds < EPSILON_MS)
{
    Console.WriteLine("More or less equal!");
}

答案 1 :(得分:0)

从问题来看,我不知道您是想比较日期与时间还是仅比较日期部分。如果您只想比较日期,那么以下工作

var result = (from rs in db.VRec
                      where               
                      rs.TimeStamp.Date == timeStamp.Date && 
                      rs.Fixure == wFixture
                      select rs).ToList();

由于您正在使用对db的一些引用,因此它让我感觉您从数据库中获取记录(您使用的ORM在问题或标记中并不明显)。假设您正在使用Entity框架,则上述查询将失败,但.Date没有直接转换为sql。如果是这样,您可以按如下方式重写查询以使其正常工作。

var result = (from rs in db.VRec
                      where               
                      rs.TimeStamp.Day == timeStamp.Day &&
                      rs.TimeStamp.Month == timeStamp.Month &&
                      rs.TimeStamp.Year == timeStamp.Year &&
                      rs.Fixure == wFixture
                      select rs).ToList();

此方法的好处是您可以将属性与任意深层次进行比较,即您可以在查询中比较HoursMinutesSeconds等。第二个查询在实体框架5中进行测试。

答案 2 :(得分:0)

Linq在执行的sql查询中将DateTime参数转换为DateTime2。 也就是说,当你进行比较时,执行的实际sql会将DateTime与DateTime2进行比较。这个比较会将DateTime“转换”为DateTime2,毫秒部分将扩展到更高的分辨率(在我看来,请以奇怪的方式启发我)。

尝试执行以下sql:

 .box {
  align-content: flex-start;
  border: solid 5px gray;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  margin-left: 50px;
  max-width: 900px;
  height: 100%;
  overflow-y: scroll;
}

.innerbox {


  background-color:gray;
    background-size: cover;
  margin: 5px;
  flex-direction: row;
  display: flex;
  border: solid 1px gray;
  flex-wrap: wrap;
  justify-content: space-between;
}