Преобразование SQL ROW_NUMBER в Linq приводит к неправильному переводуC#

Место общения программистов C#
Ответить
Anonymous
 Преобразование SQL ROW_NUMBER в Linq приводит к неправильному переводу

Сообщение Anonymous »

У меня есть следующий код SQL, и я хочу преобразовать его в запрос LINQ в Entity Framework Core 8.
SELECT *
FROM(
SELECT ROW_NUMBER() OVER (PARTITION BY StaffId,[Location] ORDER BY [Timestamp] DESC) AS rn,
StaffId,
Location,
[Timestamp]
FROM CountryStaff
WHERE [Timestamp] >=
DATEADD(hour,-1, GETDATE())
AND [Location] = 'USA'
) x
WHERE x.rn = 1

Вот мой код LINQ:
var date = DateTime.UtcNow.AddHours(-1);
var filteredTransactions = CountryStaff
.Where(t => t.Location == "USA" && t.Timestamp >= date)
.OrderByDescending(t => t.Timestamp);

filteredTransactions
.OrderByDescending(t => t.Timestamp)
.Skip(0)
.Take(1)
.Select(t => new
{
StaffId = t.StaffId,
Location = t.Location,
Timestamp = t.Timestamp
}).ToList();

Когда этот код выполняется, он транслируется следующим образом и дает неверный результат.
DECLARE @p0 NVarChar(1000) = 'USA'
DECLARE @p1 DateTime = '2024-02-28 06:25:22.590'
DECLARE @p2 Int = 0
DECLARE @p3 Int = 1

SELECT [t2].[StaffId], [t2].[Location], [t2].[Timestamp]
FROM (
SELECT [t1].[StaffId], [t1].[Timestamp], [t1].[Location], [t1].[ROW_NUMBER]
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[Timestamp] DESC, [t0].[Timestamp] DESC) AS [ROW_NUMBER], [t0].[StaffId], [t0].[Timestamp], [t0].[Location]
FROM [CountryStaff] AS [t0]
WHERE ([t0].[Location] = @p0) AND ([t0].[Timestamp] >= @p1)
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p2 + 1 AND @p2 + @p3
) AS [t2]
ORDER BY [t2].[ROW_NUMBER]

РЕДАКТИРОВАТЬ
Я пытаюсь использовать этот код. Он работает хорошо, хотя и переводит различные SQL-запросы. К сожалению, это занимает 5 секунд вместо 0,6 мс.
CountryStaff
.Where(t => t.Timestamp >= date && t.Location == "USA")
.GroupBy(t => new { t.StaffId, t.Location })
.Select(g => g.OrderByDescending(t => t.Timestamp).First())
.ToList();


Подробнее здесь: https://stackoverflow.com/questions/780 ... ranslation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»