比较LINQ实体框架中的日期



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

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

但是我总是得到一个错误

LINQ表达式…无法翻译

在审查了其他帖子之后,我看到了一个常见的解决方案是使用DbFunctions类。然而,在使用Nuget导入实体框架6.4.4和Microsoft.EntityFrameworkCore5.0.9之后,我无法访问该类。此外,Entity类不在System.Data命名空间中。

关于我如何得到这个查询运行的任何信息,或者我使用DbFunctions做错了什么将不胜感激。谢谢。

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

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

此代码将查找过去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天的记录,包括今天:

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

这将忽略null并使用覆盖DueDt的任何索引

如果你使用MS Sql Server,你可以试试这个

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

最新更新