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

Sql server 使用EF Core的linq查询中使用日期的奇怪结果,sql-server,entity-framework,linq,datetime,asp.net-core,Sql Server,Entity Framework,Linq,Datetime,Asp.net Core,我尝试使用Linq和EF Core对日期列进行简单查询,得到了奇怪的结果 如果使用DateTime列表中的日期运行查询,则不会得到任何结果。如果我替换DateTime.Now并添加一个负数天,那么如果与DateTime列表中的日期匹配,则查询将返回预期结果 那么DateTime.Now和另一个DateTime对象之间有什么区别呢 实际上,为什么这项工作(在第一个示例中,现在倒带30天,给出与第二个示例中的日期检查[0]相同的日期): 但不是这个: var reports = from r

我尝试使用Linq和EF Core对日期列进行简单查询,得到了奇怪的结果

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

那么DateTime.Now和另一个DateTime对象之间有什么区别呢

实际上,为什么这项工作(在第一个示例中,现在倒带30天,给出与第二个示例中的日期检查[0]相同的日期):

但不是这个:

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);
    }       
}   
var datesToCheck=newlist();
var startDate=DateTime.Now;
//三周前得到星期一的约会
如果(DateTime.Now.DayOfWeek!=DayOfWeek.Monday)
{
while(startDate.DayOfWeek!=DayOfWeek.Monday)
{
startDate=startDate.AddDays(-1);
}
}
startDate=startDate.AddDays(-21);
while(startDate
您可能有一些数据类型问题,请尝试:

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;

您可能有一些数据类型问题,请尝试:

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;

就我所知,EF6和所有版本的EF中都存在相同的行为。基本上,编译器不够聪明,无法决定是计算datesToCheck[0]还是将其转换为SQL。如果将值存储在变量中,然后在LINQ查询中使用该变量,则查询将起作用。另请参见:

同样的行为存在于EF6中,据我所知,EF的所有版本都存在。基本上,编译器不够聪明,无法决定是计算datesToCheck[0]还是将其转换为SQL。如果将值存储在变量中,然后在LINQ查询中使用该变量,则查询将起作用。另请参见:

没有意义,您能给我们看一下
datesToCheck[0]
声明和值吗?没问题,Juan Carlos-我将其添加到问题中没有意义,两个谓词都将在内存中计算(第一个原因是
AddDays
函数,第二个原因是数组/列表索引器)。只要
datesToCheck[0]
包含
DateTime。Now.AddDays(-30)
,两个查询都应该返回一个相同的结果。没有意义,你能给我们看
datesToCheck[0]
声明和值吗?没问题Juan Carlos-我已经将其添加到问题中了。没有意义,两个谓词都将在内存中计算(第一个原因是
AddDays
函数,第二个原因是数组/列表索引器)。只要
datesToCheck[0]
包含
DateTime.Now.AddDays(-30)
,两个查询都应返回一个相同的结果。感谢Juan Carlos-这与放置DateTime.Now.AddDays(-30)的效果相同在查询内部。只有当我尝试使用DateTime列表中的值时,它才会失败。即使我创建一个新的DateTime变量并将列表中的值分配给它,它仍然不会返回任何结果。正如我所说的,
datesToCheck[0]存在问题
variable您调试了值吗?我仍在检查您的代码,但还没有看到任何内容。谢谢Juan Carlos-这与放置DateTime一样有效。Now.AddDays(-30)在查询内部。只有当我尝试使用DateTime列表中的值时,它才会失败。即使我创建一个新的DateTime变量并将列表中的值分配给它,它仍然不会返回任何结果。正如我所说的,
datesToCheck[0]存在问题
variable您是否调试了该值?我仍在检查您的代码,但尚未看到任何内容。