.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);
相关推荐
吾与谁归in29 分钟前
【C#设计模式(21)——状态模式(State Pattern)】
设计模式·c#·状态模式
骑着王八撵玉兔2 小时前
【非关系型数据库Redis 】 入门
java·数据库·spring boot·redis·后端·缓存·nosql
阳光开朗_大男孩儿4 小时前
QT_BEGIN_NAMESPACE 和 QT_END_NAMESPACE(一)
开发语言·数据库·qt
YashanDB5 小时前
【YashanDB知识库】启动yasom时报错:sqlite connection error
数据库·yashandb·崖山数据库
DATA无界5 小时前
抢先体验:人大金仓数据库管理系统KingbaseES V9 最新版本 CentOS 7.9 部署体验
linux·数据库·centos
全栈师5 小时前
WinForm事件遇到异步方法的处理方式
java·开发语言·c#
2301_775602386 小时前
简易内存池
java·服务器·数据库
zhujyy1106 小时前
Django 中数据库迁移命令
数据库·sqlite
一二小选手6 小时前
【Redis】万字整理 Redis 非关系型数据库的安装与操作
java·数据库·redis
我是苏苏7 小时前
ABP框架8——仓储的作用及其基础Demo
数据库·mysql