.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);
相关推荐
Skilce2 小时前
ZrLog 高可用部署
运维·服务器·数据库·阿里云·maven
indexsunny5 小时前
互联网大厂Java求职面试实战:微服务与Spring生态全攻略
java·数据库·spring boot·安全·微服务·面试·消息队列
沪漂阿龙5 小时前
别再让数据库“吃”脏数据了!一文讲透MySQL约束,从入门到精通
数据库·mysql
一念春风5 小时前
智能文字识别工具(AI)
开发语言·c#·wpf
追逐时光者6 小时前
DotNetGuide突破了10K + Star,一份全面且免费的C#/.NET/.NET Core学习、工作、面试指南知识库!
后端·.net
追逐时光者6 小时前
分享 5 种 .NET 桌面应用程序自动更新解决方案
.net
2401_873544926 小时前
使用Python进行PDF文件的处理与操作
jvm·数据库·python
虾..7 小时前
多路复用 --- select系统调用
服务器·数据库·sql
杨云龙UP7 小时前
mysqldump逻辑备份文件恢复总结:全库恢复、单库恢复,一篇讲明白
linux·运维·服务器·数据库·mysql·adb
ybwycx7 小时前
mysql重置root密码(适用于5.7和8.0)
数据库·mysql·adb