20230827
This commit is contained in:
parent
cb8ffde7c0
commit
b09af0c79f
145
anbs_cp/Structs/KeyValueList.cs
Normal file
145
anbs_cp/Structs/KeyValueList.cs
Normal 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
|
||||
}
|
@ -2,7 +2,7 @@
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<Version>2023.813.1</Version>
|
||||
<Version>2023.827.0</Version>
|
||||
<Authors>Александр Бабаев</Authors>
|
||||
<Product>Набор компонентов ANB Software</Product>
|
||||
<Description>Библиотека полезных методов языка C#</Description>
|
||||
|
@ -26,7 +26,7 @@ public class MySqlEngine: IDbEngine
|
||||
/// <param name="sql">Запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <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);
|
||||
@ -44,7 +44,7 @@ public class MySqlEngine: IDbEngine
|
||||
/// <param name="sql">Запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <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>
|
||||
/// Запрос
|
||||
@ -53,7 +53,7 @@ public class MySqlEngine: IDbEngine
|
||||
/// <param name="sql">Запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <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);
|
||||
@ -72,7 +72,7 @@ public class MySqlEngine: IDbEngine
|
||||
/// <param name="sql">Запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <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>
|
||||
/// Запрос строки
|
||||
@ -81,7 +81,7 @@ public class MySqlEngine: IDbEngine
|
||||
/// <param name="sql">Запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <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);
|
||||
@ -100,7 +100,7 @@ public class MySqlEngine: IDbEngine
|
||||
/// <param name="sql">Запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <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
|
||||
|
||||
@ -113,7 +113,7 @@ public class MySqlEngine: IDbEngine
|
||||
/// <param name="sql">SQL-запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <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>
|
||||
/// Получает массив данных (SELECT * FROM...)
|
||||
@ -122,7 +122,7 @@ public class MySqlEngine: IDbEngine
|
||||
/// <param name="sql">SQL-запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <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>
|
||||
/// Получает строку в массиве данных
|
||||
@ -131,7 +131,7 @@ public class MySqlEngine: IDbEngine
|
||||
/// <param name="sql">SQL-запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <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);
|
||||
@ -150,7 +150,7 @@ public class MySqlEngine: IDbEngine
|
||||
/// <param name="sql">SQL-запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <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>
|
||||
/// Получает колонку в массиве данных
|
||||
@ -159,7 +159,7 @@ public class MySqlEngine: IDbEngine
|
||||
/// <param name="sql">SQL-запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <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);
|
||||
|
||||
/// <summary>
|
||||
@ -169,7 +169,7 @@ public class MySqlEngine: IDbEngine
|
||||
/// <param name="sql">SQL-запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <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();
|
||||
|
||||
/// <summary>
|
||||
@ -179,7 +179,7 @@ public class MySqlEngine: IDbEngine
|
||||
/// <param name="sql">SQL-запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <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);
|
||||
@ -198,7 +198,7 @@ public class MySqlEngine: IDbEngine
|
||||
/// <param name="sql">SQL-запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <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();
|
||||
|
||||
#endregion
|
||||
|
@ -1,4 +1,6 @@
|
||||
namespace anbs_cp.Database.Interfaces;
|
||||
using System.Transactions;
|
||||
|
||||
namespace anbs_cp.Database.Interfaces;
|
||||
|
||||
/// <summary>
|
||||
/// Интерфейс для работы с базой данных
|
||||
@ -18,7 +20,7 @@ public interface IDbEngine
|
||||
/// <param name="sql">Запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <returns>Количество затронутых строк</returns>
|
||||
Task<int> ExecuteAsync (string sql, object values);
|
||||
Task<int> ExecuteAsync (string sql, object? values = null);
|
||||
|
||||
/// <summary>
|
||||
/// Выполняем команду
|
||||
@ -26,7 +28,7 @@ public interface IDbEngine
|
||||
/// <param name="sql">Запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <returns>Количество затронутых строк</returns>
|
||||
int Execute (string sql, object values);
|
||||
int Execute (string sql, object? values = null);
|
||||
|
||||
/// <summary>
|
||||
/// Запрос
|
||||
@ -35,7 +37,7 @@ public interface IDbEngine
|
||||
/// <param name="sql">Запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <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>
|
||||
/// Запрос
|
||||
@ -44,7 +46,7 @@ public interface IDbEngine
|
||||
/// <param name="sql">Запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
|
||||
IEnumerable<T> Query<T> (string sql, object values);
|
||||
IEnumerable<T> Query<T> (string sql, object? values = null);
|
||||
|
||||
/// <summary>
|
||||
/// Запрос строки
|
||||
@ -53,7 +55,7 @@ public interface IDbEngine
|
||||
/// <param name="sql">Запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
|
||||
Task<T?> QueryRowAsync<T> (string sql, object values);
|
||||
Task<T?> QueryRowAsync<T> (string sql, object? values = null);
|
||||
|
||||
/// <summary>
|
||||
/// Запрос строки
|
||||
@ -62,7 +64,7 @@ public interface IDbEngine
|
||||
/// <param name="sql">Запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <returns>Возвращает массив типа <see cref="T"/> или значение по умолчанию</returns>
|
||||
T? QueryRow<T> (string sql, object values);
|
||||
T? QueryRow<T> (string sql, object? values = null);
|
||||
#endregion
|
||||
|
||||
#region Получение данных
|
||||
@ -74,7 +76,7 @@ public interface IDbEngine
|
||||
/// <param name="sql">SQL-запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <returns>Массив результата запроса</returns>
|
||||
Task<IEnumerable<T>> GetResultsAsync<T> (string sql, object values);
|
||||
Task<IEnumerable<T>> GetResultsAsync<T> (string sql, object? values = null);
|
||||
|
||||
/// <summary>
|
||||
/// Получает массив данных (SELECT * FROM...)
|
||||
@ -83,7 +85,7 @@ public interface IDbEngine
|
||||
/// <param name="sql">SQL-запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <returns>Массив результата запроса</returns>
|
||||
IEnumerable<T> GetResults<T> (string sql, object values);
|
||||
IEnumerable<T> GetResults<T> (string sql, object? values = null);
|
||||
|
||||
/// <summary>
|
||||
/// Получает строку в массиве данных
|
||||
@ -92,7 +94,7 @@ public interface IDbEngine
|
||||
/// <param name="sql">SQL-запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <returns>Строки данных или null</returns>
|
||||
Task<T?> GetRowAsync<T> (string sql, object values);
|
||||
Task<T?> GetRowAsync<T> (string sql, object? values = null);
|
||||
|
||||
/// <summary>
|
||||
/// Получает строку в массиве данных
|
||||
@ -101,7 +103,7 @@ public interface IDbEngine
|
||||
/// <param name="sql">SQL-запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <returns>Строки данных или null</returns>
|
||||
T? GetRow<T> (string sql, object values);
|
||||
T? GetRow<T> (string sql, object? values = null);
|
||||
|
||||
/// <summary>
|
||||
/// Получает колонку в массиве данных
|
||||
@ -110,7 +112,7 @@ public interface IDbEngine
|
||||
/// <param name="sql">SQL-запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <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>
|
||||
/// Получает колонку в массиве данных
|
||||
@ -119,7 +121,7 @@ public interface IDbEngine
|
||||
/// <param name="sql">SQL-запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <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>
|
||||
/// Получение значение единичного поля
|
||||
@ -128,7 +130,7 @@ public interface IDbEngine
|
||||
/// <param name="sql">SQL-запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <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>
|
||||
/// Получение значение единичного поля
|
||||
@ -137,7 +139,7 @@ public interface IDbEngine
|
||||
/// <param name="sql">SQL-запрос</param>
|
||||
/// <param name="values">Данные запроса</param>
|
||||
/// <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
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
<RootNamespace>anbs_cp.Database</RootNamespace>
|
||||
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
|
||||
<PackageId>ANBSoftware.ComponentsPack.Database</PackageId>
|
||||
<Version>2023.08.19.4</Version>
|
||||
<Version>2023.08.27.0</Version>
|
||||
<Company>Александр Бабаев</Company>
|
||||
<Product>Набор компонентов ANB Software для работы с БД</Product>
|
||||
<Description>Библиотека полезных методов языка C# для работы с базами данных</Description>
|
||||
|
Loading…
x
Reference in New Issue
Block a user