如何在 EF Core 的 Where 子句中使用日期?

How to Use Dates in Where Clause in EF Core?

我需要按日期过滤查询,但在这种情况下我不关心存储在 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 查询。

使用

var now = DateTime.Now.Date
...WHERE(CreatedDate.Date == now)

我刚刚检查了上面是否转换为以下 SQL 查询:

WHERE ((CONVERT(date, [x].[CreatedDate]) = '2019-01-07T00:00:00.000')

我使用这个 (link) 方法来查看 LINQ 转换成什么