Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
.NET Core

Получить последние N записей для группы

02.05.2021, 15:59. Показов 1555. Ответов 0

Студворк — интернет-сервис помощи студентам
Здрасти, что-то я повис на простой задаче. Допустим есть стандартная база с двумя таблицами: Blogs и Posts и мне надо получить по N последних постов из определенных блогов. Использую EF Core и PostgreSQL. Ну я пишу прямо
C#
1
2
3
4
5
var blogIds = new[] { 111, 222, 333 };
 
var posts = context.Blogs.Where(b => blogIds.Contains(b.ID))
    .SelectMany(b => b.Posts.OrderByDescending(p => p.Created).Take(2))
    .ToArray();
и о ужас, запрос выполняется ~350ms (база 2к блогов, 300к постов)
SQL генерируемый EF

SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT t0."ID", t0."BlogID", t0."Created", t0."Text"
FROM "Blogs" AS b
INNER JOIN (
    SELECT t."ID", t."BlogID", t."Created", t."Text"
    FROM (
        SELECT p."ID", p."BlogID", p."Created", p."Text", ROW_NUMBER() OVER(PARTITION BY p."BlogID" ORDER BY p."Created" DESC) AS ROW
        FROM "Posts" AS p
    ) AS t
    WHERE t.row <= 2
) AS t0 ON b."ID" = t0."BlogID"
WHERE b."ID" = ANY ('{111,222,333}')

Хотя вот такой SQL выполняется за 2мс
Подправленный SQL
SQL
1
2
3
4
5
6
7
SELECT p2."ID", p2."BlogID", p2."Created", p2."Text"
FROM (
    SELECT p."ID", p."BlogID", p."Created", p."Text", ROW_NUMBER() OVER(PARTITION BY p."BlogID" ORDER BY p."Created" DESC) AS ROW
    FROM "Posts" AS p
    WHERE p."BlogID" = ANY ('{111,222,333}')
) AS p2
WHERE p2.row <= 2

Как можно переписать запрос на более эффективный?
P.S. Попробовал через Union, работает за ~5мс, но как-то такое решение выглядит не очень как мне кажется
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
                        IQueryable<Post> GetBlogLastPosts(int id, int count)
                        {
                            return context.Posts
                                .Where(p => p.BlogID == id)
                                .OrderByDescending(p => p.Created)
                                .Take(count);
                        };
                        IQueryable<Post> posts = null;
                        foreach (var id in blogIds)
                        {
                            posts = posts == null ? GetBlogLastPosts(id, 2) : posts.Union(GetBlogLastPosts(id, 2));
                        }
 
                        var result = posts.ToArray();
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.05.2021, 15:59
Ответы с готовыми решениями:

Получить последние N записей
А как последние N записей получить?

Запрос: Получить из базы последние 10 записей отфильтрованных по условию
Есть база, с которой получаю данные по запросу: SELECT events.id, events.date, events.status, event_objects.name, ...

Скрипт для репоста записей из группы вк
Нужен скрипт для репоста записей из группы на страницу ВК.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.05.2021, 15:59
Помогаю со студенческими работами здесь

Вывод группы записей, если условие выполняется хотя бы с одной записью из группы
Из базы данных со связью &quot;многие ко многим&quot; выбираю таблицу с сообщениями, соединённую с таблицей адресов, по которому каждое сообщение...

Количество записей в таблице для каждой группы
Привет ребят, в общем вроде бы элементарно все, но говнокодить не хочется и прошу помочь рационально решить проблему. Нужно...

Excel и группы записей. Импорт записей, согласно категории(которая указана в экселе)
Задаю вопрос, т.к. не нашёл ни в яндексе, ни тут ответ. Просьба ткнуть носом, т.к. считаю что вопрос на уровне новичка и тема должна была...

Составьте подобную ведомость для группы из N человек на основе сформированного массива записей
Помогите пожалуйста написать В экзамеционной ведомости фиксируются фамилии учеников , номера билетов, оценки, записанной прописью ...

Дан массив записей:специальность, курс, название группы студентов и средний балл.Создать новый масив записей
Дан массив записей:специальность, курс, название группы студентов и средний балл.Создать новый масив записей в котором будут те группы в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Функция установки текстового статуса в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru