使用Linq和EF Core尝试对日期列进行简单查询时,我得到了奇怪的结果。
如果我使用DateTime列表中的日期运行查询,则无法获得任何结果。如果我替换DateTime.Now并添加负天数,以便如果匹配DateTimes列表中的日期,则查询将按预期返回结果。
那么DateTime.Now和另一个DateTime对象有什么区别?
在实践中,为什么这样做(第一个示例中现在倒带30天与第二个示例中的 datesToCheck [0] 相同):
var reports = from r
in db.DailyReports
.Where(r => r.UserId.Equals(currentuser.Identity.Name)
&& r.Date > DateTime.Now.AddDays(-30))
select r;
但不是这样:
var reports = from r
in db.DailyReports
.Where(r => r.UserId.Equals(currentuser.Identity.Name)
&& r.Date > datesToCheck[0])
select r;
数据库是SQL Server 2017,该列是一个不可为空的smalldatetime
生成datesToCheck列表:
var datesToCheck = new List<DateTime>();
var startDate = DateTime.Now;
//get Monday date three weeks ago
if (DateTime.Now.DayOfWeek != DayOfWeek.Monday)
{
while (startDate.DayOfWeek != DayOfWeek.Monday)
{
startDate = startDate.AddDays(-1);
}
}
startDate = startDate.AddDays(-21);
while (startDate < DateTime.Now)
{
if (startDate.DayOfWeek != DayOfWeek.Saturday || startDate.DayOfWeek != DayOfWeek.Sunday)
{
datesToCheck.Add(startDate);
startDate = startDate.AddDays(1);
}
}
答案 0 :(得分:1)
EF6中存在相同的行为,据我所知,所有版本的EF都存在。基本上,编译器不够聪明,无法决定是否应评估datesToCheck [0]或将其转换为SQL。如果将值存储在变量中,然后在LINQ查询中使用该变量,则查询将起作用。另见:Why can't we use arrays in Entity Framework queries?
答案 1 :(得分:0)
您可能有一些数据类型问题,尝试:
DateTime datesToCheck = DateTime.Now.AddDays(-30);
var reports = from r
in db.DailyReports
.Where(r => r.UserId.Equals(currentuser.Identity.Name)
&& r.Date > datesToCheck )
select r;