首页 > 解决方案 > 比较 LINQ 实体框架中的日期

问题描述

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

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

但我不断收到错误

无法翻译 LINQ 表达式 ...xxx...

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

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

标签: c#entity-frameworklinqdbfunctions

解决方案


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

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

此代码将查找过去 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


推荐阅读