LINQ到实体日期时间比较

本文关键字:时间 比较 日期 实体 LINQ | 更新日期: 2023-09-27 17:57:43

我在将LINQ中的日期与实体表达式进行比较时遇到问题。我想检查一下DateTime == DateTime - whole day

我想这样做:

 return context.Events.Any(x => 
                            x.UserId == id 
                            && x.Date >= date 
                            && x.Date < date.AddDays(1) 
                            && x.Type == EventType.StartWork);

问题是,由于AddDays()方法的原因,使用LINQ时上述查询不正确。

我尝试过使用DbFunctions如下:

return context.Events.Any(x => 
                            x.UserId == id 
                            && x.Date >= date 
                            && x.Date < DbFunctions.AddDays(date, 1) 
                            && x.Type == EventType.StartWork);

还有这个:

  return context.Events.Any(x => 
                                x.UserId == id 
                                && DbFunctions.TruncateTime(date.Date) == date.Date 
                                && x.Type == EventType.StartWork);

这些查询都没有给出预期的结果。

LINQ到实体日期时间比较

只需创建两个日期:

var datePlusOneDay = date.AddDays(1);
return context.Events.Any(x => x.UserId == id 
                         && x.Date >= date 
                         && x.Date < datePlusOneDay 
                         && x.Type == EventType.StartWork);

我也不确定,但问题可能是,你们的约会不仅可以有日期部分,还可以有时间部分。

因此,为了确保您只选择DateTime变量的日期部分,您可以这样做:

date = date.Date;
var datePlusOneDay = date.AddDays(1);

即使不能在查询前初始化日期,在Linq To Entities中也应该使用System.Data.Entity.DbFunctions.DiffDays:

return context.Events
    .Any(x => x.UserId == id && x.Date > date 
        && System.Data.Entity.DbFunctions.DiffDays(x.Date, date) < 1
        && x.Type == EventType.StartWork);

您可以通过使用DbFunctions.TruncateTime来实现您想要的内容,但仅限于等式的两边

 return context.Events.Any(x => 
        x.UserId == id 
        && DbFunctions.TruncateTime(x.Date) == DbFunctions.TruncateTime(date)
        && x.Type == EventType.StartWork);