首页 > 解决方案 > 如何在 EF Core 的 Where 子句中使用日期?

问题描述

我需要按日期过滤查询,但在这种情况下,我不关心存储在 SQL 数据库中的时间部分。

我首先尝试了类似的东西

var now = DateTime.Now.Date;
Where(x => x.CreatedDate.Date.Compare(now) == 0)

但这似乎都在本地检查,使查询变慢。如果不让它在本地进行检查,我怎么能做到这一点?

我非常想找到今天(2020-01-06)发生的所有结果。

标签: c#sqldatetimeef-core-2.2

解决方案


在构建 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查询。


推荐阅读