c# - 比较 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.EntityFrameworkCore
5.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
推荐阅读
- solid-principles - 引用 SOLID 原则时,“客户”是什么意思?
- azure - Azure 应用程序网关返回 502
- floating-point - 反复规范化 IEEE 浮点向量会使其发生变异吗?
- object - 如何检查 tensorflow object_detection 中的训练/评估性能
- dialogflow-es - Dialogflow 响应中缺少输出音频
- java - Maven deploy -x 给出 Failed to deploy artifacts ....拒绝访问:http://
- rx-java - 我想触发并忘记返回 Observable 的 HTTP 调用。我发现它阻塞了主线程
- mysql - Alter Query 比数据库中任何其他比它大的表花费更多的时间
- c++ - 查找重载与模板化函数时的不同 c++ 编译器行为
- c# - C#中参数的通配符