using System.Data; using System.Diagnostics; namespace CrupestApi.Commons.Crud; /// /// is an optional column name related to the param. You may use it to do some column related things. Like use a more accurate conversion. /// /// /// If value is DbNullValue, it will be treated as null. /// public record ParamInfo(string Name, object? Value, string? ColumnName = null); public class ParamList : List { private static Random random = new Random(); private const string chars = "abcdefghijklmnopqrstuvwxyz"; public static string GenerateRandomKey(int length) { lock (random) { var result = new string(Enumerable.Repeat(chars, length) .Select(s => s[random.Next(s.Length)]).ToArray()); return result; } } public string GenerateRandomParameterName() { var parameterName = GenerateRandomKey(10); int retryTimes = 1; while (ContainsKey(parameterName)) { retryTimes++; Debug.Assert(retryTimes <= 100); parameterName = GenerateRandomKey(10); } return parameterName; } public bool ContainsKey(string name) { return this.SingleOrDefault(p => p.Name.Equals(name, StringComparison.OrdinalIgnoreCase)) is not null; } public T? Get(string key) { return (T?)this.SingleOrDefault(p => p.Name.Equals(key, StringComparison.OrdinalIgnoreCase))?.Value; } public object? this[string key] { get { return this.SingleOrDefault(p => p.Name.Equals(key, StringComparison.OrdinalIgnoreCase)) ?? throw new KeyNotFoundException("Key not found."); } } public void Add(string name, object? value, string? columnName = null) { Add(new ParamInfo(name, value, columnName)); } // Return the random name. public string AddRandomNameParameter(object? value, string? columnName = null) { var parameterName = GenerateRandomParameterName(); var param = new ParamInfo(parameterName, value, columnName); Add(param); return parameterName; } }