【发布时间】: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