Sql server 如何在EF Core和LINQ中表达GetDate()和DateAdd()方法?
我正在使用SQL Server和实体框架核心2。我有以下SQL查询(在SQL Server Management Studio中),它正确地为我提供了前一小时添加的度量值(到度量值表中): 这很有效。但是现在我想使用EF Core 2在LINQ中编写这个查询。 当然,我可以编写以下代码:Sql server 如何在EF Core和LINQ中表达GetDate()和DateAdd()方法?,sql-server,linq,entity-framework-core,Sql Server,Linq,Entity Framework Core,我正在使用SQL Server和实体框架核心2。我有以下SQL查询(在SQL Server Management Studio中),它正确地为我提供了前一小时添加的度量值(到度量值表中): 这很有效。但是现在我想使用EF Core 2在LINQ中编写这个查询。 当然,我可以编写以下代码: dbContext .Measurement .Include(m => m.Section) .GroupBy(m => m.Section, (section, m) =>
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();
但这有以下缺点:
- DateTime.Now无法转换为SQL,因此将在性能不佳的客户机上对此进行评估
- 客户端的时区与数据库服务器时区不同,需要额外的复杂性和计算
如何在EF Core中表达查询,以便将其完全转换为SQL?您使用的是什么确切的EF Core版本
DateTime.Now.AddHours(-1)
在最新的EF Core 2.2.3中完美地转换为DATEADD(hour,-1.0E0,GETDATE())
,我使用的是2.1.8。我被日志消息触发:“Microsoft.EntityFrameworkCore.Query:警告:LINQ表达式'where({from Measurement z in[x]select[z].Timestamp=>Max()}>DateTime.Now.AddHours(-1))'无法翻译,将在本地进行计算。”升级到2.2.3后也是这样。问题可能是Max
。有空的时候我去看看。同时,您可以验证它不会发生在“正常”中,其中
(不涉及GroupBy
)对不起,我无法使用提供的查询进行复制。我试图重建实体模型,但查询同时给出了“忽略的包含”警告和“必须是可还原的节点”异常。删除Include
并将GroupBy(m=>m.Section
更改为GroupBy(m=>new{m.Section.Name,m.Section.CustomerId}
允许我运行它,并将其完全转换为SQL。因此,要找到代码的具体问题,我们需要,但原始问题的一般答案是GETDATE()
=>DateTime.Now
和DateAdd
=>DateTime.AddXyz
(Xyz
:Hours
,Minutes
等)
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();