如何在 EF Core 和 LINQ 中表达 GetDate() 和 DateAdd() 方法?

Wou*_*pen 5 linq sql-server entity-framework-core

我正在使用 SQL Server 和 Entity Framework Core 2。我有以下 SQL 查询(在 SQL Server Management Studio 中)正确地为我提供了前一小时添加的度量(到度量表):

SELECT id, [timestamp] 
FROM measurement 
WHERE
  dateADD(MINUTE, 60, [timestamp]) > getdate()
Run Code Online (Sandbox Code Playgroud)

这很好用。但是现在我想使用 EF Core 2 在 LINQ 中编写此查询。当然我可以编写以下代码:

dbContext
   .Measurement
   .Include(m => m.Section)
   .GroupBy(m => m.Section, (section, m) => new Section
    {
       Name = section.Name,
       CustomerId = section.CustomerId,
       MostRecentMeasurement = m.Max(z => z.Timestamp)
    })
   .Where(x => x.MostRecentMeasurement > DateTime.Now.AddHours(-1))
   .ToList();
Run Code Online (Sandbox Code Playgroud)

但这有以下缺点:

  • DateTime.Now 无法转换为 SQL,因此这将在性能不佳的客户端进行评估,
  • 客户端的时区与数据库服务器时区不同,需要额外的复杂性和计算。

如何在 EF Core 中表达查询,使其可以完全转换为 SQL?

Aar*_*als 0

DateTime.Now.AddHours(-1) 完美转换为 EF Core 5.0.8 中的 DATEADD(hour, -1.0E0, GETDATE())。

(请注意,我转载了 Ivan Stoev 的评论,因为它回答了我的类似问题。)