.NET使用SqlSugar实现单列批量更新的几种实现和对比

说明:

  • SqlSugarCore版本:5.1.4.169

方式1 使用SqlSugar的Updateable

特点:

  • 代码可读性好,易于维护
  • 支持事务和异常处理

适用场景:

  • 中小型数据量更新

优点:

  • 代码简洁
  • 易于调试

缺点:

  • 性能相对较低
  • 内存占用较大
cs 复制代码
public async Task<int> BatchUpdateColumnAsync(
    string tableName,
    string columnName,
    List<KeyValuePair<int, object>> idValuePairs)
{
    try
    {
        // 验证输入
        if (string.IsNullOrEmpty(tableName) ||
            string.IsNullOrEmpty(columnName) ||
            !idValuePairs.Any())
        {
            return 0;
        }

        // 构建更新数据
        var updateData = idValuePairs
            .Select(x => new Dictionary<string, object>
            {
            { "ID", x.Key },
            { columnName, x.Value }
            })
            .ToList();

        // 执行批量更新
        return await _sqlSugarClient.Updateable(updateData)
            .AS(tableName)
            .WhereColumns("ID")
            .ExecuteCommandAsync();
    }
    catch (Exception ex)
    {
        // 处理异常
        throw new Exception($"批量更新列 {columnName} 失败", ex);
    }
}

方式2 使用CASE WHEN SQL

特点:

  • 采用 CASE WHEN 语法

适用场景:

  • 中等数据量更新

优点:

  • 执行效率高

缺点:

  • 可维护性较差
cs 复制代码
public async Task<int> BatchUpdateColumnAsync(
    string tableName,
    string columnName,
    List<KeyValuePair<int, object>> idValuePairs)
{
    // 构建SQL
    var sql = $"UPDATE {tableName} SET {columnName} = CASE Id ";
    foreach (var pair in idValuePairs)
    {
        sql += $"WHEN {pair.Key} THEN @value{pair.Key} ";
    }
    sql += $"END WHERE Id IN ({string.Join(",", idValuePairs.Select(p => p.Key))})";

    // 构建参数
    var parameters = idValuePairs
        .Select(p => new SugarParameter($"@value{p.Key}", p.Value))
        .ToArray();
    // 执行更新
    return await _sqlSugarClient.Ado.ExecuteCommandAsync(sql, parameters);
}

方式3 批量SQL语句

特点:

  • 多条 UPDATE 语句拼接
  • 每条记录独立更新

适用场景:

  • 小批量数据更新
  • 需要独立处理每条记录的场景
  • 需要精确控制的场景

优点:

  • 实现简单
  • 易于理解
  • 灵活性高

缺点:

  • 性能一般
  • 不适合大量数据
cs 复制代码
public async Task<int> BatchUpdateColumnAsync(
    string tableName,
    string columnName,
    List<KeyValuePair<int, object>> updates)
{
    var sqlList = updates.Select(x =>
        $"UPDATE {tableName} SET {columnName} = @value{x.Key} WHERE Id = {x.Key};");

    var sql = string.Join("\n", sqlList);

    var parameters = updates
        .Select(x => new SugarParameter($"@value{x.Key}", x.Value))
        .ToArray();

    return await _sqlSugarClient.Ado.ExecuteCommandAsync(sql, parameters);
}

方式4 Bulk Update(大批量数据更新,性能要求高的场景)

特点:

  • 使用 DataTable 批量操作
  • 高性能实现

适用场景:

  • 大批量数据更新
  • 性能要求高的场景
  • 需要处理大量数据的场景

优点:

  • 性能最优
  • 内存效率高
  • 适合大数据量

缺点:

  • 需要额外的数据转换
cs 复制代码
public async Task<int> BatchUpdateColumnAsync(
    string tableName,
    string columnName,
    List<KeyValuePair<int, object>> updates)
{
    // 创建 DataTable
    var dt = new System.Data.DataTable(tableName);
    dt.Columns.Add("ID", typeof(int));
    dt.Columns.Add(columnName, typeof(object));  // 使用传入的列名

    // 添加数据
    foreach (var update in updates)
    {
        dt.Rows.Add(update.Key, update.Value);
    }

    // 批量更新
    return await _sqlSugarClient.Fastest<System.Data.DataTable>().AS(tableName).BulkUpdateAsync(tableName, dt, new string[] { "ID" }, new string[] { columnName });
}

使用

cs 复制代码
// 使用示例
var updates = new List<KeyValuePair<int, object>>
{
    new KeyValuePair<int, object>(1, 89.6), // (id, 更新值)
    new KeyValuePair<int, object>(2, 999.7)
};
// 表名,列名,更新数据
await BatchUpdateColumnAsync("tb_import_data", "WaterLevel", updates);
相关推荐
网络安全指导员7 分钟前
SQL注入的那些面试题总结
数据库·sql·安全·web安全·系统安全
奈斯ing19 分钟前
【Oracle篇】SQL性能优化实战案例(从15秒优化到0.08秒)(第七篇,总共七篇)
运维·数据库·sql·oracle·性能优化
时光の尘20 分钟前
C语言菜鸟入门·关键字·void的用法
c语言·开发语言·c++·算法·c#·c·关键字
Karoku06638 分钟前
【企业级分布式系统】ELK-企业级日志分析系统
运维·数据库·redis·mysql·elk·缓存
小小宇宙中微子41 分钟前
mysql 命名约束
数据库·sql·oracle
八荒我为王43 分钟前
c#编码技巧(十九):各种集合特点汇总
c#·.net
Crossoads1 小时前
【汇编语言】call 和 ret 指令(一) —— 探讨汇编中的ret和retf指令以及call指令及其多种转移方式
android·开发语言·javascript·汇编·人工智能·数据挖掘·c#
linweidong1 小时前
MariaDB面试题及参考答案
linux·运维·数据库·负载均衡·dba·mariadb·后端面试
PGCCC3 小时前
【PGCCC】Postgresql 缓存替换算法
数据库·缓存·postgresql