Модель для хранимой процедуры MySQL 8.0

Вопрос или проблема

Я создал запрос в MySQL 8.0.

Я хочу создать класс модели для следующего запроса:

call rep_getusercheckinsperday(2024,9,’XXX’);

результат 1 – 2024-09

call rep_getusercheckinsperday(2024,10,’XXX’);

результат 2 – 2024-10

Проблема в том, что строки, а также и столбцы являются переменными, то есть в одном месяце может быть 30 дней, в другом 31 день, и у меня может быть 5, 10 или 15 пользователей.

Примечание: ASP.NET Core 6.0 (C#) + MySQL 8.0

Я пытался сделать это так:

public class DBGetMyGuidesReportsbyDay
{
    public string User { get; set; } = "";
    public long? Total { get; set; } = 0;
    public string Day { get; set; } = "";
}

Я хочу сначала указать, что MySQL на самом деле не предназначен для использования в таком динамическом формате. Вместо переменного количества столбцов вы должны рассмотреть возможность использования статического, более строго типизированного подхода, как это показано в руководстве пользователя MySQL. Кто я, чтобы говорить вам, что вы можете делать, а что нет… но было бы безответственно, если бы я не попытался направить вас на другой путь, пока у вас еще есть возможность.

Если же вы настаиваете на продолжении использования динамического подхода к таблицам, я попробовал бы решить эту задачу, храня извлеченные данные в объекте типа dynamic, List<k, v> или Dictionary<k, v>, а затем перебирая каждую запись. В каждом цикле этой итерации вы проверите, является ли “запись” (ваш “столбец” в этом случае) столбцом пользователя или нет;

..если нет) continue

..если да) создайте новый экземпляр вашего класса DBGetMyGuidesReportsbyDay, где “ключ” равен User

Надеюсь, это поможет!

* Редактирование, добавлена ссылка на документацию MySQL.
https://dev.mysql.com/doc/refman/8.0/en/creating-tables.html

Ответ или решение

Конечно! Давайте разберем, как можно реализовать динамическое представление данных, возвращаемых из хранимой процедуры в MySQL, в контексте ASP.NET Core 6.0 с использованием C#.

Шаг 1: Модель данных

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

public class DailyUserCheckinsReport
{
    public string Day { get; set; } = ""; // Дата
    public Dictionary<string, long> UserCheckins { get; set; }

    public DailyUserCheckinsReport()
    {
        UserCheckins = new Dictionary<string, long>();
    }
}

Шаг 2: Вызов хранимой процедуры

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

public async Task<List<DailyUserCheckinsReport>> GetUserCheckinsPerDay(int year, int month, string userId)
{
    var reports = new List<DailyUserCheckinsReport>();

    using (var connection = new MySqlConnection("your_connection_string"))
    {
        await connection.OpenAsync();

        using (var command = new MySqlCommand("rep_getusercheckinsperday", connection))
        {
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.AddWithValue("@year", year);
            command.Parameters.AddWithValue("@month", month);
            command.Parameters.AddWithValue("@user_id", userId);

            using (var reader = await command.ExecuteReaderAsync())
            {
                while (await reader.ReadAsync())
                {
                    var day = reader.GetString(0);
                    var user = reader.GetString(1);
                    var total = reader.GetInt64(2);

                    var report = reports.FirstOrDefault(r => r.Day == day);
                    if (report == null)
                    {
                        report = new DailyUserCheckinsReport { Day = day };
                        reports.Add(report);
                    }

                    report.UserCheckins[user] = total;
                }
            }
        }
    }

    return reports;
}

Объяснение метода

  1. Подключение к базе данных: Мы используем MySqlConnection для подключения к базе данных. Не забудьте заменить "your_connection_string" на вашу строку подключения к MySQL.

  2. Вызов хранимой процедуры: С помощью MySqlCommand мы вызываем хранимую процедуру rep_getusercheckinsperday, передавая необходимые параметры.

  3. Чтение результатов: Используем MySqlDataReader для чтения результатов. Мы ищем отчёты по дням и добавляем пользователей в Dictionary, где ключ — это имя пользователя, а значение — количество чекаутов.

Заключение

Используя подход с Dictionary, вы сможете гибко справляться с переменным количеством пользователей и днями. Это также позволит вам избежать проблем, связанных с динамическим созданием столбцов в таблицах, что не является рекомендуемой практикой в MySQL.

Если у вас есть дополнительные вопросы или вам нужно более подробное объяснение, пожалуйста, дайте мне знать!

Оцените материал
Добавить комментарий

Капча загружается...