c# - 如何在 EF Core 的 Where 子句中使用日期?
问题描述
我需要按日期过滤查询,但在这种情况下,我不关心存储在 SQL 数据库中的时间部分。
我首先尝试了类似的东西
var now = DateTime.Now.Date;
Where(x => x.CreatedDate.Date.Compare(now) == 0)
但这似乎都在本地检查,使查询变慢。如果不让它在本地进行检查,我怎么能做到这一点?
我非常想找到今天(2020-01-06)发生的所有结果。
解决方案
在构建 Lambda/Linq 表达式时,可以对可翻译类型使用的方法数量有限。这是因为每个方法都需要额外的代码,以便可以将其转换为 sql 存储表达式。这意味着您必须检查是否支持您想要使用并期望被转换为 sql 存储表达式的任何方法。
在这种情况下,DateTime.Compare
不支持。
这里最简单的做法是进行简单的范围比较,因为时间包含在您的持久值中。
var start = DateTime.Now.Date;
var end = start.AddDays(1);
Where(x => x.CreatedDate >= start && x.CreatedDate < end)
这将导致一个sargable查询。
推荐阅读
- c# - 什么命名空间包含 HolograicFrameData 类型?
- error-handling - 为什么我不能使用 println!处理匹配语句中的错误但恐慌!作品?
- java - 我需要添加哪些附加条件/代码才能使“类列表插入代码”在 JUNIT 中变为绿色?
- powershell - Unity.exe 命令行构建需要 10 分钟,但编辑器需要不到一分钟
- c - 在制表符分隔的文本文件中使用 fscanf 计算空值
- python - Python Webcolors - 没有定义的颜色名称
- javascript - 使用下一个和上一个按钮自动和手动更改幻灯片
- javascript - Mongoose 在文档更新时不尊重参考架构定义
- blazor - 核心身份种子用户 HashPassword 登录失败
- vue.js - 基本 vue.js 上的 dist 文件夹