如何在 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 转换成什么
我需要按日期过滤查询,但在这种情况下我不关心存储在 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 转换成什么