LINQ to Entities DateTime比较

时间:2016-07-20 07:44:42

标签: c# entity-framework linq datetime

我在将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不正确。

我试图使用如下的DbFunction:

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);

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

3 个答案:

答案 0 :(得分:5)

只需创建2个日期:

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);

答案 1 :(得分:3)

即使您无法在查询前使用System.Data.Entity.DbFunctions.DiffDays初始化日期,Linq-To-Entities中应该有效的另一种方式:

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

答案 2 :(得分:3)

您可以使用 DbFunctions.TruncateTime 来实现您想要的效果,但只需在等式的两边

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