using System.Text; namespace CrupestApi.Commons.Crud; public class InsertItem { /// /// Null means use default value. Use . /// public InsertItem(string columnName, object? value) { ColumnName = columnName; Value = value; } public string ColumnName { get; set; } public object? Value { get; set; } } public interface IInsertClause : IClause { List Items { get; } string GenerateColumnListSql(string? dbProviderId = null); (string sql, ParamList parameters) GenerateValueListSql(string? dbProviderId = null); } public class InsertClause : IInsertClause { public List Items { get; } = new List(); public InsertClause(params InsertItem[] items) { Items.AddRange(items); } public InsertClause Add(params InsertItem[] items) { Items.AddRange(items); return this; } public InsertClause Add(string column, object? value) { return Add(new InsertItem(column, value)); } public static InsertClause Create(params InsertItem[] items) { return new InsertClause(items); } public List GetRelatedColumns() { return Items.Select(i => i.ColumnName).ToList(); } public string GenerateColumnListSql(string? dbProviderId = null) { return string.Join(", ", Items.Select(i => i.ColumnName)); } public (string sql, ParamList parameters) GenerateValueListSql(string? dbProviderId = null) { var parameters = new ParamList(); var sb = new StringBuilder(); for (var i = 0; i < Items.Count; i++) { var item = Items[i]; var parameterName = parameters.AddRandomNameParameter(item.Value, item.ColumnName); sb.Append($"@{parameterName}"); if (i != Items.Count - 1) sb.Append(", "); } return (sb.ToString(), parameters); } }