Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在EF Core和LINQ中表达GetDate()和DateAdd()方法?_Sql Server_Linq_Entity Framework Core - Fatal编程技术网

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

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) =>

我正在使用SQL Server和实体框架核心2。我有以下SQL查询(在SQL Server Management Studio中),它正确地为我提供了前一小时添加的度量值(到度量值表中):

这很有效。但是现在我想使用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();
但这有以下缺点:

  • 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();