【问题标题】:Translating datediff LINQ query to SQL with Entity Framework Core and .NET Core 3.1使用 Entity Framework Core 和 .NET Core 3.1 将 datediff LINQ 查询转换为 SQL
【发布时间】:2021-11-08 04:15:58
【问题描述】:

我正在开发将记录数量与订单日期和预约日期之间的差异相关联的报告功能(例如,我想知道有多少人提前两周与当天注册)。

出于性能原因,我真的很想在 SQL Server 上进行尽可能多的数据分组,这就是我尝试将以下 LINQ 查询转换为 SQL 的原因:

filtered.GroupBy(x => (x.AppointmentDate - x.CreatedOn).Days)
                           .Select(x => new BookingLeadTimeDbOutputDto
                           {
                               DateDiff = x.Key,
                               RecordsProcessed = x.Count()
                           });

当我使用 LINQPad 尝试此操作时效果很好,但会引发错误

System.InvalidOperationException:无法翻译 LINQ 表达式

当我在 VS 中尝试这个时。我正在使用的数据库在这两种情况下都是相同的,以及 .NET 版本(Core 3.1)。

这是 LINQPad 的 SQL 输出:

-- Region Parameters
DECLARE @p0 DateTime2 = '2018-07-10 00:00:00.0000000'
DECLARE @p1 DateTime2 = '2020-07-10 00:00:00.0000000'
-- EndRegion
SELECT COUNT(*) AS [RecordsProcessed], [t1].[value] AS [DateDiff]
FROM (
    SELECT CONVERT(Int,(CONVERT(BigInt,(((CONVERT(BigInt,DATEDIFF(DAY, [t0].[CreatedOn], [t0].[AppointmentDate]))) * 86400000) + DATEDIFF(MILLISECOND, DATEADD(DAY, DATEDIFF(DAY, [t0].[CreatedOn], [t0].[AppointmentDate]), [t0].[CreatedOn]), [t0].[AppointmentDate])) * 10000)) / 864000000000) AS [value], [t0].[AppointmentDate]
    FROM [ClientBookings] AS [t0]
    ) AS [t1]
WHERE ([t1].[AppointmentDate] >= @p0) AND ([t1].[AppointmentDate] <= @p1)
GROUP BY [t1].[value]

我会假设 EF 原则上无法将此 LINQ 转换为 SQL,但由于它在 LINQPad 中完成,我无法了解问题可能是什么,有什么想法吗?

【问题讨论】:

  • 因为 Linqpad 默认使用 LINQ-to-SQL。
  • 或者你还没有发布整个查询。

标签: c# linq entity-framework-core


【解决方案1】:

如果是MS SQL server,ef有一个特殊的函数DateDiffDay

filtered.GroupBy(x =>  EF.Functions.DateDiffDay(x.CreatedOn,x.AppointmentDate) )
                           .Select(x => new BookingLeadTimeDbOutputDto
                           {
                               DateDiff = x.Key,
                               RecordsProcessed = x.Count()
                           });

【讨论】:

  • 这对我有用,非常感谢!仍然很好奇为什么我提出的查询在项目中不起作用而在 LINQPad 中起作用......
猜你喜欢
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 2021-10-08
相关资源
最近更新 更多