.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);
相关推荐
激流丶17 分钟前
【Mysql 底层原理】MySQL 查询优化器的工作原理:如何生成最优执行计划
数据库·mysql·explain·执行计划
雷神乐乐33 分钟前
Sqoop学习
数据库·sqoop
小丑西瓜66638 分钟前
MySQL库操作
linux·服务器·数据库·mysql
谦谦均43 分钟前
PostgreSQL序列:创建、管理与高效应用指南
数据库·postgresql
荒川之神1 小时前
RHEL/CENTOS 7 ORACLE 19C-RAC安装(纯命令版)
服务器·数据库·oracle
ZWZhangYu1 小时前
【MyBatis源码】深入分析TypeHandler原理和源码
数据库·oracle·mybatis
ascarl20103 小时前
系统启动时将自动加载环境变量,并后台启动 MinIO、Nacos 和 Redis 服务
数据库·redis·缓存
LightOfNight3 小时前
Redis设计与实现第9章 -- 数据库 总结(键空间 过期策略 过期键的影响)
数据库·redis·后端·缓存·中间件·架构
不脱发的牧码人3 小时前
C#中Task和Thread的全解析
c#·多线程·thread·task
Jasonakeke3 小时前
【重学 MySQL】八十四、深入理解 LEAVE 和 ITERATE 在存储过程中的使用
数据库·mysql