Правильный способ получения статистики от дочерних объектов

#c# #mysql #asp.net #performance #entity-framework

#c# #mysql #asp.net #Производительность #entity-framework

Вопрос:

Пожалуйста, помогите мне найти способ сделать это эффективным

В программе есть следующие объекты:
Проекты 1-N модулей
, модули 1-N подмодулей.
Подмодули 1-N сегментов.
каждый сегмент имеет разный статус (по умолчанию / завершен) и количество слов

Подсчет слов производится, когда сегменты вставляются в базу данных и сохраняются в столбце.

Число просмотров. Список проектов Должно быть менее 100 проектов, поэтому для этого я перечисляю их все без включения.

Список модулей (с параметром 1 ProjectID) должен содержать столбец со словами завершено / всего и строками завершено / всего

Список подмодулей (с параметром 1 ModuleID) должен содержать столбец со словами завершено / всего и строками завершено / всего

Предположим, у меня было бы около 50 тыс. строк (сегментов) на модуль. поэтому производительность является обязательной.

Вариант 1: IQueryable дочерние объекты.Какой-то Count()
Вариант 2: добавьте столбцы статистики в таблицы в базе данных с помощью заданий CRON, чтобы обновить их или сохранить proccedure / триггеры в mysql.
Вариант 3?: Создание 2 представлений в mysql? никогда не делал их, но, возможно, они подходят для работы?
Предлагаемые варианты: пока нет

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

Комментарии:

1. Каков ваш конкретный вопрос? Пожалуйста, покажите код, который не работает.

2. Дело не в том, что это не работает, я не знаю, как правильно рассчитать такого рода статистику дочерних объектов. Это большие таблицы, и они не хотят запускать сервер каждый раз, когда я загружаю представление. Конкретный вопрос будет заключаться в следующем: как эффективно отображать завершенные слова / всего слов в представлениях

3. Почему бы не попробовать 3 варианта и измерить разницу? Обычно представление на стороне базы данных является самым быстрым.

Ответ №1:

 var query = _context.Submodules.Where(t => t.Id == id)
                    .Select(e => new Submodules{
                        Id = e.Id,
                        Name = e.Name,
                        Status = e.Status,
                        Token = e.Token,
                        ModuleId = e.ModuleId,
                        Gender = e.Gender,
                        TotalRows = e.TotalRows,
                        TotalWords = e.TotalWords,
                        CompletedWords = e.Segments.Where(a => a.Status == Abr.Recorded).Sum(y=> y.Wordcount),
                        CompletedRows = e.Segments.Where(a => a.Status == Abr.Recorded).Count()
                    }).ToList();