Вопрос по сортировке в 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 шт):

Автор решения: Blackmeser

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
→ Ссылка