diff --git a/anbs_cpdb/Classes/MySqlEngine.cs b/anbs_cpdb/Classes/MySqlEngine.cs index 8fe0d24..a5ef494 100644 --- a/anbs_cpdb/Classes/MySqlEngine.cs +++ b/anbs_cpdb/Classes/MySqlEngine.cs @@ -68,7 +68,7 @@ public class MySqlEngine: IDbEngine public async Task> QueryAsync (string sql, object model) { // Подключаемся к БД - await using MySqlConnection? connection = new(ConnectionString); + await using MySqlConnection connection = new(ConnectionString); // Открываем соединение await connection.OpenAsync(); @@ -80,35 +80,91 @@ public class MySqlEngine: IDbEngine #endregion #region Получение - public async Task> SelectAsync (string table, string[] columns, List> where, string? orderBy = null) - { - string sql = $@"SELECT - {(columns.Any() ? string.Join(", ", columns) : "*")} - FROM {table} "; + /// + /// Выборка данных из таблицы + /// + /// Тип данных + /// Имя таблицы + /// Выбор столбцов таблицы, которые должны попасть в выборку (пустая -- все) + /// Массив значений столбцов, которые должны попасть в выборку + /// Сортировка + /// Сколько максимально элементов должно быть в выборке (0 -- без ограничения) + /// Массив типа + public async Task> SelectAsync(string table, string[] columns, + List> where, string? orderBy, int limit = 0) + { + // Формирую запрос + string sql = $""" + SELECT + {(columns.Any() ? string.Join(", ", columns) : "*")} + FROM {table} + """; + + // Создаю массив where параметров List whereCondition = new(); + // Создаю массив значений List paramsValues = new(); + // Если заданы параметры where if (where.Any()) { + // - то формирую массив where из where-запроса whereCondition.AddRange(where.Select(static whereItem => $"{whereItem.Key}=@{whereItem.Key}")); + // - и значения параметров paramsValues.AddRange(where.Select(static whereItem => $"@{whereItem.Key}={whereItem.Value}")); } + // Если массив where параметров не пуст if (whereCondition.Any()) + // - то добавляю к запросу sql += $" WHERE {string.Join(", ", whereCondition.ToArray())}"; + // Если добавлена сортировка if (orderBy != null) + // - то добавляю сортировку к запросу sql += $" ORDER BY {orderBy}"; + // Если установлено запрашиваемое число элементов + if (limit > 0) + // - то вводим ограничение + sql += $" LIMIT {limit}"; + + // Осуществляю запрос и возвращаю результат return await QueryAsync(sql, paramsValues.ToArray()); } - public async Task SelectRowAsync (string table, List columns, KeyValue where, string? orderBy = null) => throw new NotImplementedException(); + /// + /// Выборка строки из таблицы + /// + /// Тип данных + /// Имя таблицы + /// Выбор столбцов таблицы, которые должны попасть в выборку (пустая -- все) + /// Массив значений столбцов, которые должны попасть в выборку + /// Сортировка + /// Тип или null + public async Task SelectRowAsync(string table, string[] columns, List> where, + string? orderBy = null) => (await SelectAsync(table, columns, where, orderBy, 1)).FirstOrDefault(); + #endregion - public async Task CountAsync (string table) => throw new NotImplementedException(); + #region Вычисление числа элементов в таблице +/// +/// Вычисляет число строк в таблице +/// +/// Таблица +/// Число строк в таблице + public async Task CountAsync(string table) + { + // Задаю запрос + string sql = $"SELECT COUNT(*) FROM {table}"; + + // Выполняю запрос + return (await QueryAsync(sql, new())).FirstOrDefault(); + } + + #endregion public async Task InsertAsync (string table, T entity, KeyValue primaryIndex) => throw new NotImplementedException(); @@ -119,4 +175,4 @@ public class MySqlEngine: IDbEngine public async Task DeleteAsync (string table, KeyValue where) => throw new NotImplementedException(); public async Task DeleteRowAsync (string table, KeyValue where) => throw new NotImplementedException(); -}} \ No newline at end of file +} \ No newline at end of file diff --git a/anbs_cpdb/Interfaces/IDbEngine.cs b/anbs_cpdb/Interfaces/IDbEngine.cs index 332713f..0150450 100644 --- a/anbs_cpdb/Interfaces/IDbEngine.cs +++ b/anbs_cpdb/Interfaces/IDbEngine.cs @@ -37,15 +37,38 @@ public interface IDbEngine #endregion #region Получение - Task> SelectAsync (string table, string[] columns, List> where, string? orderBy = null); - Task SelectRowAsync (string table, List columns, KeyValue where, string? orderBy = null); + /// + /// Выборка данных из таблицы + /// + /// Тип данных + /// Имя таблицы + /// Выбор столбцов таблицы, которые должны попасть в выборку (пустая -- все) + /// Массив значений столбцов, которые должны попасть в выборку + /// Сортировка + /// Сколько максимально элементов должно быть в выборке (0 -- без ограничения) + /// Массив типа + Task> SelectAsync (string table, string[] columns, List> where, string? orderBy, int limit = 0); + + /// + /// Выборка строки из таблицы + /// + /// Тип данных + /// Имя таблицы + /// Выбор столбцов таблицы, которые должны попасть в выборку (пустая -- все) + /// Массив значений столбцов, которые должны попасть в выборку + /// Сортировка + /// Тип или null + Task SelectRowAsync (string table, string[] columns, List> where, string? orderBy = null); #endregion #region Вычисление числа элементов в таблице - + /// + /// Вычисляет число строк в таблице + /// + /// Таблица + /// Число строк в таблице Task CountAsync (string table); - #endregion #region Добавление строки в таблицу