20230818-1

This commit is contained in:
Александр Бабаев 2023-08-18 23:05:27 +03:00
parent 4617d02649
commit 2fdb100ee0
2 changed files with 92 additions and 13 deletions

View File

@ -68,7 +68,7 @@ public class MySqlEngine: IDbEngine
public async Task<IEnumerable<T>> QueryAsync<T> (string sql, object model) public async Task<IEnumerable<T>> QueryAsync<T> (string sql, object model)
{ {
// Подключаемся к БД // Подключаемся к БД
await using MySqlConnection? connection = new(ConnectionString); await using MySqlConnection connection = new(ConnectionString);
// Открываем соединение // Открываем соединение
await connection.OpenAsync(); await connection.OpenAsync();
@ -80,35 +80,91 @@ public class MySqlEngine: IDbEngine
#endregion #endregion
#region Получение #region Получение
public async Task<IEnumerable<T>> SelectAsync<T> (string table, string[] columns, List<KeyValue<string, string>> where, string? orderBy = null)
{
string sql = $@"SELECT
{(columns.Any() ? string.Join(", ", columns) : "*")}
FROM {table} ";
/// <summary>
/// Выборка данных из таблицы
/// </summary>
/// <typeparam name="T">Тип данных</typeparam>
/// <param name="table">Имя таблицы</param>
/// <param name="columns">Выбор столбцов таблицы, которые должны попасть в выборку (пустая -- все)</param>
/// <param name="where">Массив значений столбцов, которые должны попасть в выборку</param>
/// <param name="orderBy">Сортировка</param>
/// <param name="limit">Сколько максимально элементов должно быть в выборке (0 -- без ограничения)</param>
/// <returns>Массив типа <see cref="T"/></returns>
public async Task<IEnumerable<T>> SelectAsync<T>(string table, string[] columns,
List<KeyValue<string, string>> where, string? orderBy, int limit = 0)
{
// Формирую запрос
string sql = $"""
SELECT
{(columns.Any() ? string.Join(", ", columns) : "*")}
FROM {table}
""";
// Создаю массив where параметров
List<string> whereCondition = new(); List<string> whereCondition = new();
// Создаю массив значений
List<string> paramsValues = new(); List<string> paramsValues = new();
// Если заданы параметры where
if (where.Any()) if (where.Any())
{ {
// - то формирую массив where из where-запроса
whereCondition.AddRange(where.Select(static whereItem => $"{whereItem.Key}=@{whereItem.Key}")); whereCondition.AddRange(where.Select(static whereItem => $"{whereItem.Key}=@{whereItem.Key}"));
// - и значения параметров
paramsValues.AddRange(where.Select(static whereItem => $"@{whereItem.Key}={whereItem.Value}")); paramsValues.AddRange(where.Select(static whereItem => $"@{whereItem.Key}={whereItem.Value}"));
} }
// Если массив where параметров не пуст
if (whereCondition.Any()) if (whereCondition.Any())
// - то добавляю к запросу
sql += $" WHERE {string.Join(", ", whereCondition.ToArray())}"; sql += $" WHERE {string.Join(", ", whereCondition.ToArray())}";
// Если добавлена сортировка
if (orderBy != null) if (orderBy != null)
// - то добавляю сортировку к запросу
sql += $" ORDER BY {orderBy}"; sql += $" ORDER BY {orderBy}";
// Если установлено запрашиваемое число элементов
if (limit > 0)
// - то вводим ограничение
sql += $" LIMIT {limit}";
// Осуществляю запрос и возвращаю результат
return await QueryAsync<T>(sql, paramsValues.ToArray()); return await QueryAsync<T>(sql, paramsValues.ToArray());
} }
public async Task<T> SelectRowAsync<T> (string table, List<string> columns, KeyValue<string, string> where, string? orderBy = null) => throw new NotImplementedException(); /// <summary>
/// Выборка строки из таблицы
/// </summary>
/// <typeparam name="T">Тип данных</typeparam>
/// <param name="table">Имя таблицы</param>
/// <param name="columns">Выбор столбцов таблицы, которые должны попасть в выборку (пустая -- все)</param>
/// <param name="where">Массив значений столбцов, которые должны попасть в выборку</param>
/// <param name="orderBy">Сортировка</param>
/// <returns>Тип <see cref="T"/> или null</returns>
public async Task<T?> SelectRowAsync<T>(string table, string[] columns, List<KeyValue<string, string>> where,
string? orderBy = null) => (await SelectAsync<T>(table, columns, where, orderBy, 1)).FirstOrDefault();
#endregion #endregion
public async Task<int> CountAsync (string table) => throw new NotImplementedException(); #region Вычисление числа элементов в таблице
/// <summary>
/// Вычисляет число строк в таблице <paramref name="table"/>
/// </summary>
/// <param name="table">Таблица</param>
/// <returns>Число строк в таблице <paramref name="table"/></returns>
public async Task<int> CountAsync(string table)
{
// Задаю запрос
string sql = $"SELECT COUNT(*) FROM {table}";
// Выполняю запрос
return (await QueryAsync<int>(sql, new())).FirstOrDefault();
}
#endregion
public async Task<TPit> InsertAsync<T, TPit> (string table, T entity, KeyValue<string, TPit> primaryIndex) => throw new NotImplementedException(); public async Task<TPit> InsertAsync<T, TPit> (string table, T entity, KeyValue<string, TPit> primaryIndex) => throw new NotImplementedException();
@ -119,4 +175,4 @@ public class MySqlEngine: IDbEngine
public async Task<bool> DeleteAsync<T> (string table, KeyValue<string, string> where) => throw new NotImplementedException(); public async Task<bool> DeleteAsync<T> (string table, KeyValue<string, string> where) => throw new NotImplementedException();
public async Task<bool> DeleteRowAsync<T> (string table, KeyValue<string, string> where) => throw new NotImplementedException(); public async Task<bool> DeleteRowAsync<T> (string table, KeyValue<string, string> where) => throw new NotImplementedException();
}} }

View File

@ -37,15 +37,38 @@ public interface IDbEngine
#endregion #endregion
#region Получение #region Получение
Task<IEnumerable<T>> SelectAsync<T> (string table, string[] columns, List<KeyValue<string, string>> where, string? orderBy = null);
Task<T> SelectRowAsync<T> (string table, List<string> columns, KeyValue<string, string> where, string? orderBy = null); /// <summary>
/// Выборка данных из таблицы
/// </summary>
/// <typeparam name="T">Тип данных</typeparam>
/// <param name="table">Имя таблицы</param>
/// <param name="columns">Выбор столбцов таблицы, которые должны попасть в выборку (пустая -- все)</param>
/// <param name="where">Массив значений столбцов, которые должны попасть в выборку</param>
/// <param name="orderBy">Сортировка</param>
/// <param name="limit">Сколько максимально элементов должно быть в выборке (0 -- без ограничения)</param>
/// <returns>Массив типа <see cref="T"/></returns>
Task<IEnumerable<T>> SelectAsync<T> (string table, string[] columns, List<KeyValue<string, string>> where, string? orderBy, int limit = 0);
/// <summary>
/// Выборка строки из таблицы
/// </summary>
/// <typeparam name="T">Тип данных</typeparam>
/// <param name="table">Имя таблицы</param>
/// <param name="columns">Выбор столбцов таблицы, которые должны попасть в выборку (пустая -- все)</param>
/// <param name="where">Массив значений столбцов, которые должны попасть в выборку</param>
/// <param name="orderBy">Сортировка</param>
/// <returns>Тип <see cref="T"/> или null</returns>
Task<T?> SelectRowAsync<T> (string table, string[] columns, List<KeyValue<string, string>> where, string? orderBy = null);
#endregion #endregion
#region Вычисление числа элементов в таблице #region Вычисление числа элементов в таблице
/// <summary>
/// Вычисляет число строк в таблице <paramref name="table"/>
/// </summary>
/// <param name="table">Таблица</param>
/// <returns>Число строк в таблице <paramref name="table"/></returns>
Task<int> CountAsync (string table); Task<int> CountAsync (string table);
#endregion #endregion
#region Добавление строки в таблицу #region Добавление строки в таблицу