У меня есть следующий код 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
Преобразование SQL ROW_NUMBER в Linq приводит к неправильному переводу ⇐ C#
Место общения программистов C#
1715192524
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]
[b]РЕДАКТИРОВАТЬ[/b]
Я пытаюсь использовать этот код. Он работает хорошо, хотя и переводит различные 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();
Подробнее здесь: [url]https://stackoverflow.com/questions/78072663/converting-sql-row-number-to-linq-produces-wrong-translation[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия