This commit is contained in:
Александр Бабаев 2023-08-27 09:44:19 +03:00
parent cb8ffde7c0
commit b09af0c79f
5 changed files with 179 additions and 32 deletions

View File

@ -0,0 +1,145 @@
namespace anbs_cp.Structs;
/// <summary>
/// Список из пара ключ-значение
/// </summary>
/// <typeparam name="TK">Тип ключа</typeparam>
/// <typeparam name="TV">Тип значения</typeparam>
public struct KeyValueList<TK, TV>
{
/// <summary>
/// Хранение значений
/// </summary>
private readonly List<KeyValue<TK, TV>> _list;
#region Конструкторы
/// <summary>
/// Конструктор по умолчанию
/// </summary>
public KeyValueList () => _list = new();
#endregion
#region Свойства
/// <summary>
/// Список ключей из списка
/// </summary>
public IEnumerable<TK> Keys => GetKeys();
#endregion
#region Методы
/// <summary>
/// Получает список ключей
/// </summary>
/// <returns>Список ключей</returns>
private IEnumerable<TK> GetKeys () => from keyValue in _list where keyValue.Key is not null select keyValue.Key;
/// <summary>
/// Добавляет в список параметр
/// </summary>
/// <param name="keyValue">Параметр</param>
public void Add (KeyValue<TK, TV> keyValue) => _list.Add(keyValue);
/// <summary>
/// Добавляет в список параметр
/// </summary>
/// <param name="key">Ключ параметра</param>
/// <param name="value">Значение</param>
public void Add (TK key, TV value) => _list.Add(new(key, value));
/// <summary>
/// Изменяет значение
/// </summary>
/// <param name="keyValue">Новое значение</param>
public void ChangeValue (KeyValue<TK, TV> keyValue)
{
// Если такой ключ не существует
if (!Contains(keyValue.Key!))
{
// - тогда добавляю новое значение
Add(keyValue);
// - прерываю
return;
}
// Существующее значение
KeyValue<TK, TV> existValue = GetItem(keyValue.Key!) ?? new();
// Удаляем существующее
_list.Remove(existValue);
// Добавляем новое
_list.Add(keyValue);
}
/// <summary>
/// Изменяет значение
/// </summary>
/// <param name="key">Ключ</param>
/// <param name="newValue">Новое значение</param>
public void ChangeValue (TK key, TV newValue) => ChangeValue(new(key, newValue));
/// <summary>
/// Получает элемент по ключу
/// </summary>
/// <param name="key">Ключ</param>
/// <returns>Элемент <see cref="KeyValue{TK,TV}"/></returns>
public KeyValue<TK, TV>? GetItem (TK key)
{
// Ищем элемент в списке
foreach (KeyValue<TK, TV> keyValueItem in _list.Where(keyValueItem => keyValueItem.Key!.Equals(key)))
// - возвращаем его при нахождении
return keyValueItem;
// Элемент не найден -- вывожу null
return null;
}
/// <summary>
/// Получает значение
/// </summary>
/// <param name="key">Ключ</param>
/// <returns>Значение</returns>
public TV? GetValue (TK key)
{
// Если такой ключ не существует
if (!Contains(key))
// Тогда возвращаю значение по умолчанию
return default;
// Получаю элемент
KeyValue<TK, TV> keyValue = GetItem(key) ?? new();
// Вывожу значение
return keyValue.Value;
}
/// <summary>
/// Удаляет элемент из списка
/// </summary>
/// <param name="keyValue">Элемент</param>
public void Remove (KeyValue<TK, TV> keyValue) => _list.Remove(keyValue);
/// <summary>
/// Удаляет элемент из списка
/// </summary>
/// <param name="key">Ключ элемента</param>
public void Remove (TK key) => Remove(GetItem(key) ?? new());
/// <summary>
/// Проверяет, содержится ли элемент в списке
/// </summary>
/// <param name="keyValue">Элемент</param>
/// <returns>Результат проверки</returns>
public bool Contains (KeyValue<TK, TV> keyValue) => _list.Contains(keyValue);
/// <summary>
/// Проверяет, содержится ли элемент в списке
/// </summary>
/// <param name="key">Ключ элемента</param>
/// <returns>Результат проверки</returns>
public bool Contains (TK key) => Keys.Any(keyParam => keyParam!.Equals(key));
#endregion
}

View File

@ -2,7 +2,7 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net7.0</TargetFramework>
<Version>2023.813.1</Version> <Version>2023.827.0</Version>
<Authors>Александр Бабаев</Authors> <Authors>Александр Бабаев</Authors>
<Product>Набор компонентов ANB Software</Product> <Product>Набор компонентов ANB Software</Product>
<Description>Библиотека полезных методов языка C#</Description> <Description>Библиотека полезных методов языка C#</Description>

View File

@ -26,7 +26,7 @@ public class MySqlEngine: IDbEngine
/// <param name="sql">Запрос</param> /// <param name="sql">Запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Количество затронутых строк</returns> /// <returns>Количество затронутых строк</returns>
public async Task<int> ExecuteAsync (string sql, object values) public async Task<int> ExecuteAsync (string sql, object? values = null)
{ {
// Подключаемся к БД // Подключаемся к БД
await using MySqlConnection connection = new(ConnectionString); await using MySqlConnection connection = new(ConnectionString);
@ -44,7 +44,7 @@ public class MySqlEngine: IDbEngine
/// <param name="sql">Запрос</param> /// <param name="sql">Запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Количество затронутых строк</returns> /// <returns>Количество затронутых строк</returns>
public int Execute (string sql, object values) => ExecuteAsync(sql, values).GetAwaiter().GetResult(); public int Execute (string sql, object? values = null) => ExecuteAsync(sql, values).GetAwaiter().GetResult();
/// <summary> /// <summary>
/// Запрос /// Запрос
@ -53,7 +53,7 @@ public class MySqlEngine: IDbEngine
/// <param name="sql">Запрос</param> /// <param name="sql">Запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns> /// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
public async Task<IEnumerable<T>> QueryAsync<T> (string sql, object values) public async Task<IEnumerable<T>> QueryAsync<T> (string sql, object? values = null)
{ {
// Подключаемся к БД // Подключаемся к БД
await using MySqlConnection connection = new(ConnectionString); await using MySqlConnection connection = new(ConnectionString);
@ -72,7 +72,7 @@ public class MySqlEngine: IDbEngine
/// <param name="sql">Запрос</param> /// <param name="sql">Запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns> /// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
public IEnumerable<T> Query<T> (string sql, object values) => QueryAsync<T>(sql, values).GetAwaiter().GetResult(); public IEnumerable<T> Query<T> (string sql, object? values = null) => QueryAsync<T>(sql, values).GetAwaiter().GetResult();
/// <summary> /// <summary>
/// Запрос строки /// Запрос строки
@ -81,7 +81,7 @@ public class MySqlEngine: IDbEngine
/// <param name="sql">Запрос</param> /// <param name="sql">Запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns> /// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
public async Task<T?> QueryRowAsync<T> (string sql, object values) public async Task<T?> QueryRowAsync<T> (string sql, object? values = null)
{ {
// Подключаемся к БД // Подключаемся к БД
await using MySqlConnection connection = new(ConnectionString); await using MySqlConnection connection = new(ConnectionString);
@ -100,7 +100,7 @@ public class MySqlEngine: IDbEngine
/// <param name="sql">Запрос</param> /// <param name="sql">Запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns> /// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
public T? QueryRow<T> (string sql, object values) => QueryRowAsync<T>(sql, values).GetAwaiter().GetResult(); public T? QueryRow<T> (string sql, object? values = null) => QueryRowAsync<T>(sql, values).GetAwaiter().GetResult();
#endregion #endregion
@ -113,7 +113,7 @@ public class MySqlEngine: IDbEngine
/// <param name="sql">SQL-запрос</param> /// <param name="sql">SQL-запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Массив результата запроса</returns> /// <returns>Массив результата запроса</returns>
public async Task<IEnumerable<T>> GetResultsAsync<T> (string sql, object values) => await QueryAsync<T>(sql, values); public async Task<IEnumerable<T>> GetResultsAsync<T> (string sql, object? values = null) => await QueryAsync<T>(sql, values);
/// <summary> /// <summary>
/// Получает массив данных (SELECT * FROM...) /// Получает массив данных (SELECT * FROM...)
@ -122,7 +122,7 @@ public class MySqlEngine: IDbEngine
/// <param name="sql">SQL-запрос</param> /// <param name="sql">SQL-запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Массив результата запроса</returns> /// <returns>Массив результата запроса</returns>
public IEnumerable<T> GetResults<T> (string sql, object values) => GetResultsAsync<T>(sql, values).GetAwaiter().GetResult(); public IEnumerable<T> GetResults<T> (string sql, object? values = null) => GetResultsAsync<T>(sql, values).GetAwaiter().GetResult();
/// <summary> /// <summary>
/// Получает строку в массиве данных /// Получает строку в массиве данных
@ -131,7 +131,7 @@ public class MySqlEngine: IDbEngine
/// <param name="sql">SQL-запрос</param> /// <param name="sql">SQL-запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Строки данных или null</returns> /// <returns>Строки данных или null</returns>
public async Task<T?> GetRowAsync<T> (string sql, object values) public async Task<T?> GetRowAsync<T> (string sql, object? values = null)
{ {
// Подключаемся к БД // Подключаемся к БД
await using MySqlConnection connection = new(ConnectionString); await using MySqlConnection connection = new(ConnectionString);
@ -150,7 +150,7 @@ public class MySqlEngine: IDbEngine
/// <param name="sql">SQL-запрос</param> /// <param name="sql">SQL-запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Строки данных или null</returns> /// <returns>Строки данных или null</returns>
public T? GetRow<T> (string sql, object values) => GetRowAsync<T>(sql, values).GetAwaiter().GetResult(); public T? GetRow<T> (string sql, object? values = null) => GetRowAsync<T>(sql, values).GetAwaiter().GetResult();
/// <summary> /// <summary>
/// Получает колонку в массиве данных /// Получает колонку в массиве данных
@ -159,7 +159,7 @@ public class MySqlEngine: IDbEngine
/// <param name="sql">SQL-запрос</param> /// <param name="sql">SQL-запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Колонка данных или null</returns> /// <returns>Колонка данных или null</returns>
public async Task<IEnumerable<T>> GetColAsync<T> (string sql, object values) public async Task<IEnumerable<T>> GetColAsync<T> (string sql, object? values = null)
where T : IComparable, IConvertible, IEquatable<T> => await QueryAsync<T>(sql, values); where T : IComparable, IConvertible, IEquatable<T> => await QueryAsync<T>(sql, values);
/// <summary> /// <summary>
@ -169,7 +169,7 @@ public class MySqlEngine: IDbEngine
/// <param name="sql">SQL-запрос</param> /// <param name="sql">SQL-запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Колонка данных или null</returns> /// <returns>Колонка данных или null</returns>
public IEnumerable<T> GetCol<T> (string sql, object values) where T : IComparable, IConvertible, IEquatable<T> => public IEnumerable<T> GetCol<T> (string sql, object? values = null) where T : IComparable, IConvertible, IEquatable<T> =>
GetColAsync<T>(sql, values).GetAwaiter().GetResult(); GetColAsync<T>(sql, values).GetAwaiter().GetResult();
/// <summary> /// <summary>
@ -179,7 +179,7 @@ public class MySqlEngine: IDbEngine
/// <param name="sql">SQL-запрос</param> /// <param name="sql">SQL-запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Поле или null</returns> /// <returns>Поле или null</returns>
public async Task<T?> GetVarAsync<T> (string sql, object values) where T : IComparable, IConvertible, IEquatable<T> public async Task<T?> GetVarAsync<T> (string sql, object? values = null) where T : IComparable, IConvertible, IEquatable<T>
{ {
// Подключаемся к БД // Подключаемся к БД
await using MySqlConnection connection = new(ConnectionString); await using MySqlConnection connection = new(ConnectionString);
@ -198,7 +198,7 @@ public class MySqlEngine: IDbEngine
/// <param name="sql">SQL-запрос</param> /// <param name="sql">SQL-запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Поле или null</returns> /// <returns>Поле или null</returns>
public T? GetVar<T> (string sql, object values) where T : IComparable, IConvertible, IEquatable<T> => public T? GetVar<T> (string sql, object? values = null) where T : IComparable, IConvertible, IEquatable<T> =>
GetVarAsync<T>(sql, values).GetAwaiter().GetResult(); GetVarAsync<T>(sql, values).GetAwaiter().GetResult();
#endregion #endregion

View File

@ -1,4 +1,6 @@
namespace anbs_cp.Database.Interfaces; using System.Transactions;
namespace anbs_cp.Database.Interfaces;
/// <summary> /// <summary>
/// Интерфейс для работы с базой данных /// Интерфейс для работы с базой данных
@ -18,7 +20,7 @@ public interface IDbEngine
/// <param name="sql">Запрос</param> /// <param name="sql">Запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Количество затронутых строк</returns> /// <returns>Количество затронутых строк</returns>
Task<int> ExecuteAsync (string sql, object values); Task<int> ExecuteAsync (string sql, object? values = null);
/// <summary> /// <summary>
/// Выполняем команду /// Выполняем команду
@ -26,7 +28,7 @@ public interface IDbEngine
/// <param name="sql">Запрос</param> /// <param name="sql">Запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Количество затронутых строк</returns> /// <returns>Количество затронутых строк</returns>
int Execute (string sql, object values); int Execute (string sql, object? values = null);
/// <summary> /// <summary>
/// Запрос /// Запрос
@ -35,7 +37,7 @@ public interface IDbEngine
/// <param name="sql">Запрос</param> /// <param name="sql">Запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns> /// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
Task<IEnumerable<T>> QueryAsync<T> (string sql, object values); Task<IEnumerable<T>> QueryAsync<T> (string sql, object? values = null);
/// <summary> /// <summary>
/// Запрос /// Запрос
@ -44,7 +46,7 @@ public interface IDbEngine
/// <param name="sql">Запрос</param> /// <param name="sql">Запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns> /// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
IEnumerable<T> Query<T> (string sql, object values); IEnumerable<T> Query<T> (string sql, object? values = null);
/// <summary> /// <summary>
/// Запрос строки /// Запрос строки
@ -53,7 +55,7 @@ public interface IDbEngine
/// <param name="sql">Запрос</param> /// <param name="sql">Запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns> /// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
Task<T?> QueryRowAsync<T> (string sql, object values); Task<T?> QueryRowAsync<T> (string sql, object? values = null);
/// <summary> /// <summary>
/// Запрос строки /// Запрос строки
@ -62,7 +64,7 @@ public interface IDbEngine
/// <param name="sql">Запрос</param> /// <param name="sql">Запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns> /// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
T? QueryRow<T> (string sql, object values); T? QueryRow<T> (string sql, object? values = null);
#endregion #endregion
#region Получение данных #region Получение данных
@ -74,7 +76,7 @@ public interface IDbEngine
/// <param name="sql">SQL-запрос</param> /// <param name="sql">SQL-запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Массив результата запроса</returns> /// <returns>Массив результата запроса</returns>
Task<IEnumerable<T>> GetResultsAsync<T> (string sql, object values); Task<IEnumerable<T>> GetResultsAsync<T> (string sql, object? values = null);
/// <summary> /// <summary>
/// Получает массив данных (SELECT * FROM...) /// Получает массив данных (SELECT * FROM...)
@ -83,7 +85,7 @@ public interface IDbEngine
/// <param name="sql">SQL-запрос</param> /// <param name="sql">SQL-запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Массив результата запроса</returns> /// <returns>Массив результата запроса</returns>
IEnumerable<T> GetResults<T> (string sql, object values); IEnumerable<T> GetResults<T> (string sql, object? values = null);
/// <summary> /// <summary>
/// Получает строку в массиве данных /// Получает строку в массиве данных
@ -92,7 +94,7 @@ public interface IDbEngine
/// <param name="sql">SQL-запрос</param> /// <param name="sql">SQL-запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Строки данных или null</returns> /// <returns>Строки данных или null</returns>
Task<T?> GetRowAsync<T> (string sql, object values); Task<T?> GetRowAsync<T> (string sql, object? values = null);
/// <summary> /// <summary>
/// Получает строку в массиве данных /// Получает строку в массиве данных
@ -101,7 +103,7 @@ public interface IDbEngine
/// <param name="sql">SQL-запрос</param> /// <param name="sql">SQL-запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Строки данных или null</returns> /// <returns>Строки данных или null</returns>
T? GetRow<T> (string sql, object values); T? GetRow<T> (string sql, object? values = null);
/// <summary> /// <summary>
/// Получает колонку в массиве данных /// Получает колонку в массиве данных
@ -110,7 +112,7 @@ public interface IDbEngine
/// <param name="sql">SQL-запрос</param> /// <param name="sql">SQL-запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Колонка данных или null</returns> /// <returns>Колонка данных или null</returns>
Task<IEnumerable<T>> GetColAsync<T> (string sql, object values) where T: IComparable, IConvertible, IEquatable<T>; Task<IEnumerable<T>> GetColAsync<T> (string sql, object? values = null) where T: IComparable, IConvertible, IEquatable<T>;
/// <summary> /// <summary>
/// Получает колонку в массиве данных /// Получает колонку в массиве данных
@ -119,7 +121,7 @@ public interface IDbEngine
/// <param name="sql">SQL-запрос</param> /// <param name="sql">SQL-запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Колонка данных или null</returns> /// <returns>Колонка данных или null</returns>
IEnumerable<T> GetCol<T> (string sql, object values) where T: IComparable, IConvertible, IEquatable<T>; IEnumerable<T> GetCol<T> (string sql, object? values = null) where T: IComparable, IConvertible, IEquatable<T>;
/// <summary> /// <summary>
/// Получение значение единичного поля /// Получение значение единичного поля
@ -128,7 +130,7 @@ public interface IDbEngine
/// <param name="sql">SQL-запрос</param> /// <param name="sql">SQL-запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Поле или null</returns> /// <returns>Поле или null</returns>
Task<T?> GetVarAsync<T> (string sql, object values) where T: IComparable, IConvertible, IEquatable<T>; Task<T?> GetVarAsync<T> (string sql, object? values = null) where T: IComparable, IConvertible, IEquatable<T>;
/// <summary> /// <summary>
/// Получение значение единичного поля /// Получение значение единичного поля
@ -137,7 +139,7 @@ public interface IDbEngine
/// <param name="sql">SQL-запрос</param> /// <param name="sql">SQL-запрос</param>
/// <param name="values">Данные запроса</param> /// <param name="values">Данные запроса</param>
/// <returns>Поле или null</returns> /// <returns>Поле или null</returns>
T? GetVar<T> (string sql, object values) where T: IComparable, IConvertible, IEquatable<T>; T? GetVar<T> (string sql, object? values = null) where T: IComparable, IConvertible, IEquatable<T>;
#endregion #endregion

View File

@ -8,7 +8,7 @@
<RootNamespace>anbs_cp.Database</RootNamespace> <RootNamespace>anbs_cp.Database</RootNamespace>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild> <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<PackageId>ANBSoftware.ComponentsPack.Database</PackageId> <PackageId>ANBSoftware.ComponentsPack.Database</PackageId>
<Version>2023.08.19.4</Version> <Version>2023.08.27.0</Version>
<Company>Александр Бабаев</Company> <Company>Александр Бабаев</Company>
<Product>Набор компонентов ANB Software для работы с БД</Product> <Product>Набор компонентов ANB Software для работы с БД</Product>
<Description>Библиотека полезных методов языка C# для работы с базами данных</Description> <Description>Библиотека полезных методов языка C# для работы с базами данных</Description>