使用EF Core在linq查询中使用日期的奇怪结果

时间:2017-04-05 16:09:20

标签: sql-server entity-framework linq datetime asp.net-core

使用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);
    }       
}   

2 个答案:

答案 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;