.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 分钟前
Oracle OCP知识点详解2:管理用户密码期限
数据库·oracle·开闭原则·ocp
PingCAP19 分钟前
TiDB 亮相宜昌“医院‘云数智’技术实践研讨及成果展示交流会”,探讨国产化 + AI 背景下的数据库新趋势
数据库·人工智能·tidb
艾妮艾妮25 分钟前
C语言常见3种排序
java·c语言·开发语言·c++·算法·c#·排序算法
努力的小Qin27 分钟前
银河麒麟V10 aarch64架构安装mysql教程
数据库·mysql·架构
云心雨禅37 分钟前
解决大小写、保留字与特殊字符问题!Oracle双引号在SQL中的特殊应用
数据库·sql·oracle
小码编匠1 小时前
.NET 验证码生成神器基于 SkiaSharp 的高性能方案
后端·c#·.net
vivo互联网技术1 小时前
活动中台系统慢 SQL 治理实践
java·数据库·后端
爱可生开源社区1 小时前
当测试工具开始「思考」,是工具还是「同事」?
数据库
专注VB编程开发20年1 小时前
Aspose.words,Aspose.cells,vb.net,c#加载许可证,生成操作选择:嵌入的资源
c#·word·.net·vb.net