Преобразование SQL ROW_NUMBER в Linq приводит к неправильному переводу ⇐ C#
Преобразование SQL ROW_NUMBER в Linq приводит к неправильному переводу
У меня есть следующий код SQL, и я хочу преобразовать его в лямбда-запрос Linq в Entity Framework Core 8.
ВЫБРАТЬ * ОТ( SELECT ROW_NUMBER() OVER (PARTITION BY StaffId, [Location] ORDER BY [Timestamp] DESC) AS rn, Идентификатор персонала, Расположение, [Отметка времени] ОТ CountryStaff ГДЕ [метка времени] >= ДАТЕАДД(час,-1, ПОЛУЧИТЬДАТУ()) И [Местоположение] = 'США' ) Икс ГДЕ х.рн = 1 Вот мой код Linq.
var date = DateTime.UtcNow.AddHours(-1); var filteredTransactions = CountryStaff .Where(t => t.Location == "США" && t.Timestamp >= дата) .OrderByDescending(t => t.Timestamp); фильтрованные транзакции .OrderByDescending(t => t.Timestamp) .Пропустить(0) .Возьмите(1) .Select(t => новый { StaffId = t.StaffId, Местоположение = t.Местоположение, Временная метка = t.Timestamp }).К списку(); Когда этот код выполняется, он транслируется следующим образом и дает неверный результат
DECLARE @p0 NVarChar(1000) = 'США' ОБЪЯВИТЬ @p1 DateTime = '2024-02-28 06:25:22.590' ОБЪЯВИТЬ @p2 Int = 0 ОБЪЯВИТЬ @p3 Int = 1 ВЫБЕРИТЕ [t2].[StaffId], [t2].[Местоположение], [t2].[Метка времени] ОТ ( ВЫБЕРИТЕ [t1].[StaffId], [t1].[Метка времени], [t1].[Местоположение], [t1].[ROW_NUMBER] ОТ ( ВЫБРАТЬ ROW_NUMBER() OVER (ORDER BY [t0].[Timestamp] DESC, [t0].[Timestamp] DESC) AS [ROW_NUMBER], [t0].[StaffId], [t0].[Timestamp], [t0] .[Расположение] ОТ [CountryStaff] AS [t0] ГДЕ ([t0].[Location] = @p0) И ([t0].[Timestamp] >= @p1) ) АС [t1] ГДЕ [t1].[ROW_NUMBER] МЕЖДУ @p2 + 1 И @p2 + @p3 ) АС [t2] ЗАКАЗАТЬ ПО [t2].[ROW_NUMBER] ИЗМЕНИТЬ
Я пытаюсь использовать этот код. Он работает хорошо, хотя и переводит разные SQL-запросы. К сожалению, это занимает 5 секунд вместо 0,6 мс.
CountryStaff .Where(t => t.Timestamp >= date && t.Location == "США") .GroupBy(t => new { t.StaffId, t.Location }) .Select(g => g.OrderByDescending(t => t.Timestamp).First()) .К списку();
У меня есть следующий код SQL, и я хочу преобразовать его в лямбда-запрос Linq в Entity Framework Core 8.
ВЫБРАТЬ * ОТ( SELECT ROW_NUMBER() OVER (PARTITION BY StaffId, [Location] ORDER BY [Timestamp] DESC) AS rn, Идентификатор персонала, Расположение, [Отметка времени] ОТ CountryStaff ГДЕ [метка времени] >= ДАТЕАДД(час,-1, ПОЛУЧИТЬДАТУ()) И [Местоположение] = 'США' ) Икс ГДЕ х.рн = 1 Вот мой код Linq.
var date = DateTime.UtcNow.AddHours(-1); var filteredTransactions = CountryStaff .Where(t => t.Location == "США" && t.Timestamp >= дата) .OrderByDescending(t => t.Timestamp); фильтрованные транзакции .OrderByDescending(t => t.Timestamp) .Пропустить(0) .Возьмите(1) .Select(t => новый { StaffId = t.StaffId, Местоположение = t.Местоположение, Временная метка = t.Timestamp }).К списку(); Когда этот код выполняется, он транслируется следующим образом и дает неверный результат
DECLARE @p0 NVarChar(1000) = 'США' ОБЪЯВИТЬ @p1 DateTime = '2024-02-28 06:25:22.590' ОБЪЯВИТЬ @p2 Int = 0 ОБЪЯВИТЬ @p3 Int = 1 ВЫБЕРИТЕ [t2].[StaffId], [t2].[Местоположение], [t2].[Метка времени] ОТ ( ВЫБЕРИТЕ [t1].[StaffId], [t1].[Метка времени], [t1].[Местоположение], [t1].[ROW_NUMBER] ОТ ( ВЫБРАТЬ ROW_NUMBER() OVER (ORDER BY [t0].[Timestamp] DESC, [t0].[Timestamp] DESC) AS [ROW_NUMBER], [t0].[StaffId], [t0].[Timestamp], [t0] .[Расположение] ОТ [CountryStaff] AS [t0] ГДЕ ([t0].[Location] = @p0) И ([t0].[Timestamp] >= @p1) ) АС [t1] ГДЕ [t1].[ROW_NUMBER] МЕЖДУ @p2 + 1 И @p2 + @p3 ) АС [t2] ЗАКАЗАТЬ ПО [t2].[ROW_NUMBER] ИЗМЕНИТЬ
Я пытаюсь использовать этот код. Он работает хорошо, хотя и переводит разные SQL-запросы. К сожалению, это занимает 5 секунд вместо 0,6 мс.
CountryStaff .Where(t => t.Timestamp >= date && t.Location == "США") .GroupBy(t => new { t.StaffId, t.Location }) .Select(g => g.OrderByDescending(t => t.Timestamp).First()) .К списку();
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Что означает $row[$i]=&$row[$i]; иметь в виду? Кажется, $row получает ссылку на себя
Anonymous » » в форуме Php - 0 Ответы
- 43 Просмотры
-
Последнее сообщение Anonymous
-