我在将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);
这些查询都没有给出预期的结果。
答案 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);