diff options
| author | crupest <crupest@outlook.com> | 2022-12-06 11:14:32 +0800 | 
|---|---|---|
| committer | crupest <crupest@outlook.com> | 2022-12-20 20:32:52 +0800 | 
| commit | 6482d66894bf618b727e499f1e26b1d4d7ea795e (patch) | |
| tree | b33df5481aa9ea36e9236976725e64d00e05327f | |
| parent | f357eefb805b0078588d97c72d3d8b047025b842 (diff) | |
| download | crupest-6482d66894bf618b727e499f1e26b1d4d7ea795e.tar.gz crupest-6482d66894bf618b727e499f1e26b1d4d7ea795e.tar.bz2 crupest-6482d66894bf618b727e499f1e26b1d4d7ea795e.zip  | |
Develop secret api. v11
4 files changed, 109 insertions, 1 deletions
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs index f6bbb12..b7f74e6 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs @@ -62,4 +62,12 @@ public class CrudService<TEntity>          var sql = _table.GenerateSelectSql(where, orderBy, skip, limit, out parameters);          return await connection.QueryAsync<TEntity>(sql, parameters);      } + +    public virtual async Task<int> UpdateAsync(WhereClause? where, UpdateClause update) +    { +        var connection = await EnsureDatabase(); +        DynamicParameters parameters; +        var sql = _table.GenerateUpdateSql(where, update, out parameters); +        return await connection.ExecuteAsync(sql, parameters); +    }  } diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs index 04d7f40..bf62df2 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs @@ -189,4 +189,34 @@ CREATE TABLE {tableName}(          return result.ToString();      } + +    public string GenerateUpdateSql(WhereClause? whereClause, UpdateClause updateClause, out DynamicParameters parameters) +    { +        var relatedColumns = new HashSet<string>(); +        if (whereClause is not null) +            relatedColumns.UnionWith(((IWhereClause)whereClause).GetRelatedColumns() ?? Enumerable.Empty<string>()); +        relatedColumns.UnionWith(updateClause.GetRelatedColumns()); +        foreach (var column in relatedColumns) +        { +            if (!ColumnNameList.Contains(column)) +            { +                throw new ArgumentException($"Field {column} is not in the table."); +            } +        } + +        parameters = new DynamicParameters(); + +        StringBuilder sb = new StringBuilder("UPDATE "); +        sb.Append(TableName); +        sb.Append(" SET "); +        sb.Append(updateClause.GenerateSql(parameters)); +        if (whereClause is not null) +        { +            sb.Append(" WHERE "); +            sb.Append(whereClause.GenerateSql(parameters)); +        } +        sb.Append(';'); + +        return sb.ToString(); +    }  }
\ No newline at end of file diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/UpdateClause.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/UpdateClause.cs new file mode 100644 index 0000000..84267a3 --- /dev/null +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/UpdateClause.cs @@ -0,0 +1,70 @@ +using System.Text; +using Dapper; + +namespace CrupestApi.Commons.Crud; + +public class UpdateItem +{ +    public UpdateItem(string columnName, object? value) +    { +        ColumnName = columnName; +        Value = value; +    } + +    public UpdateItem(KeyValuePair<string, object?> pair) +    { +        ColumnName = pair.Key; +        Value = pair.Value; +    } + +    public string ColumnName { get; set; } +    public object? Value { get; set; } + +    public static implicit operator KeyValuePair<string, object?>(UpdateItem item) +    { +        return new(item.ColumnName, item.Value); +    } + +    public static implicit operator UpdateItem(KeyValuePair<string, object?> pair) +    { +        return new(pair); +    } +} + +public class UpdateClause +{ +    public List<UpdateItem> Items { get; } = new List<UpdateItem>(); + +    public UpdateClause(IEnumerable<UpdateItem> items) +    { +        Items.AddRange(items); +    } + +    public UpdateClause(params UpdateItem[] items) +    { +        Items.AddRange(items); +    } + +    public List<string> GetRelatedColumns() +    { +        return Items.Select(i => i.ColumnName).ToList(); +    } + +    public string GenerateSql(DynamicParameters parameters) +    { +        StringBuilder result = new StringBuilder(); + +        foreach (var item in Items) +        { +            if (result.Length > 0) +            { +                result.Append(", "); +            } + +            var parameterName = parameters.AddRandomNameParameter(item.Value); +            result.Append($"{item.ColumnName} = @{parameterName}"); +        } + +        return result.ToString(); +    } +} diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/WhereClause.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/WhereClause.cs index a62aaec..674ac9d 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/WhereClause.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/WhereClause.cs @@ -53,7 +53,7 @@ public interface IWhereClause  public static class DynamicParametersExtensions  { -    public static string AddRandomNameParameter(this DynamicParameters parameters, object value) +    public static string AddRandomNameParameter(this DynamicParameters parameters, object? value)      {          var parameterName = IWhereClause.GenerateRandomParameterName(parameters);          parameters.Add(parameterName, value);  | 
