说明:
- SqlSugarCore版本:5.1.4.169
方式1 使用SqlSugar的Updateable
特点:
- 代码可读性好,易于维护
- 支持事务和异常处理
适用场景:
- 中小型数据量更新
优点:
- 代码简洁
- 易于调试
缺点:
- 性能相对较低
- 内存占用较大
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 语法
适用场景:
- 中等数据量更新
优点:
- 执行效率高
缺点:
- 可维护性较差
public async Task<int> BatchUpdateColumnAsync(string tableName,string columnName,List<KeyValuePair<int, object>> idValuePairs)
{// 构建SQLvar 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 语句拼接
- 每条记录独立更新
适用场景:
- 小批量数据更新
- 需要独立处理每条记录的场景
- 需要精确控制的场景
优点:
- 实现简单
- 易于理解
- 灵活性高
缺点:
- 性能一般
- 不适合大量数据
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 批量操作
- 高性能实现
适用场景:
- 大批量数据更新
- 性能要求高的场景
- 需要处理大量数据的场景
优点:
- 性能最优
- 内存效率高
- 适合大数据量
缺点:
- 需要额外的数据转换
public async Task<int> BatchUpdateColumnAsync(string tableName,string columnName,List<KeyValuePair<int, object>> updates)
{// 创建 DataTablevar 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 });
}
使用
// 使用示例
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);