比较 LINQ 中的日期 Entity Framework

Comparing dates in LINQ Entity Framework

我正在尝试 运行 以下查询:

List<EPCRA_Events> x = 
    _dbContext.EPCRA_Events
              .Where(e => e.DueDt.HasValue && 
                          (e.DueDt.Value - DateTime.Now).Days < 30)
              .ToList();

但我一直收到错误消息

The LINQ expression ...xxx... could not be translated

在查看其他帖子后,我发现一个常见的解决方案是使用 DbFunctions class。但是,在使用 Nuget 导入 Entity Framework 6.4.4 和 Microsoft.EntityFrameworkCore 5.0.9 后,我无法访问 class。此外,Entity class 不在 System.Data 命名空间中。

如能提供有关如何将此查询发送至 运行 或我在使用 DbFunctions 时做错了什么的任何信息,我们将不胜感激。谢谢。

如果你使用 MS Sql 服务器你可以试试这个

var dateTimeNow=DateTime.Now;

var x = _dbContext.EPCRA_Events.Where(e => EF.Functions.DateDiffDay(e.DueDt, dateTimeNow) < 30).ToList();

即使可以翻译查询,它也将是一个糟糕的查询,因为它必须在过滤之前计算每一行的差异。索引无济于事,因为索引是根据存储的值构建的。

解决方法是提前计算截止日期,直接与字段进行比较

此代码将查找过去 30 天内的记录

var cutoff=DateTime.Now.AddDays(-30);

List<EPCRA_Events> x =  _dbContext
              .Where(e => e.DueDt > cutoff)
              .ToList();

虽然这将查找未来 30 天内的记录:

var cutoff=DateTime.Now.AddDays(30);

List<EPCRA_Events> x =  _dbContext
              .Where(e => e.DueDt < cutoff)
              .ToList();

虽然这将在接下来的 30 天内 return 记录,包括今天:

var cutoff=DateTime.Now.AddDays(30);

List<EPCRA_Events> x =  _dbContext
              .Where(e => e.DueDt>=DateTime.Today &&  e.DueDt < cutoff)
              .ToList();

这将忽略 NULL 并使用涵盖 DueDt

的任何索引