Вопрос по сортировке в EF Core
Проблема с этим запросом.
db.Table.Select(x => new { id = x.id, date = x.date }).OrderByDescending(x=>x.date).Select(x=>x.id).Distinct().Take(40);
При Вызове Distinct() все ключи теряют сортировку. Такая же ситуация при вызове GroupBy(x=>x);
Помогите пожалуйста получить первые ключи без потери сортировки. Запрос должен быть выполнен на стороне SQL сервера, т.е. ни AsEnumerable(), ни ToList() после OrderByDescending не подходят.
И спрошу еще по теме:
db.Table.GroupBy(x=>x.id).Select(x=>x.First());
Какой аналог запроса для EF Core для серверной стороны существует ныне?
Ответы (1 шт):
db.Table.GroupBy в EFCore3.1 не работает! Сам недавно долбился с этой проблемой. Может быть в EFCore5 и вернули, но не могу утверждать.
Что касается вашего проблемного запроса:
var qr = db.Table.Select(x => new { id = x.id, date = x.date })
.OrderByDescending(x => x.date).Select(x => x.id).Distinct().Take(40);
var result = db.Table.Where(w => qr.Contains(w.id))
.Select(x => new { id = x.id, date = x.date })
.OrderByDescending(x => x.date).Select(x => x.id)
.ToList(); //если вам ToList() не нужен - он не обязателен
Как выглядит вывод qr и result соответственно на выборке из 5 результатов вместо 40 на моей БД (сортировка по времени сохраняется):
qr result
12951 12952
12952 12953
12953 12955
12954 12951
12955 12954
Данный код выглядит как следующий SQL запрос:
SELECT r.id
FROM Table_ AS r
WHERE EXISTS (
SELECT 1
FROM (
SELECT DISTINCT r0.id
FROM Table_ AS r0
LIMIT @__p_0
) AS t
WHERE t.id = r.id)
ORDER BY r.date DESC