2017-04-05 24 views
0

我得到奇怪的结果,试图使用Linq和EF Core对日期列进行简单查询。奇怪的结果在使用EF核心的linq查询中使用日期

如果我使用DateTime列表中的日期运行查询,则不会得到任何结果。如果我替换DateTime.Now并添加负数天,以便如果匹配日期时间列表中的日期,则查询返回预期结果。

那么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服务器2017年,列

的datesToCheck列表生成周四非空的SMALLDATETIME S:

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

没有意义,您能向我们展示'datesToCheck [0]'声明和值吗? –

+0

没问题胡安卡洛斯 - 我已经将它添加到问题 – Tim

+0

没有意义,两个谓词将在内存中进行评估(首先因为AddDays函数,其次是因为数组/列表索引器)。只要'datesToCheck [0]'包含'DateTime.Now.AddDays(-30)',两个查询都应该返回一个相同的结果。 –

回答

1

同样的行为,而且据我所知,EF的所有版本。基本上,编译器不够聪明,以决定是否应该计算或转换为SQL的datesToCheck [0]。如果将该值存储在变量中,然后在LINQ查询中使用该变量,该查询将起作用。另请参阅:Why can't we use arrays in Entity Framework queries?

0

你可能有一些数据类型的问题,尝试:存在于EF6

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; 
+0

感谢胡安卡洛斯 - 这与在查询中放置DateTime.Now.AddDays(-30)相同。只有当我尝试使用DateTime列表中的值时,它才会失败。即使我创建一个新的DateTime变量并将列表中的值赋给它,它仍然不会返回任何结果。 – Tim

+0

正如我所说的,问题是你用'datesToCheck [0]'变量调试了这个值吗?我仍然检查你的代码,但没有看到任何东西。 –