我在将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);
这些查询都没有给出预期的结果。
只需创建两个日期:
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);