You need to enable JavaScript to run this app. 如何在Angular+C#+Oracle项目中仅保存数组内被修改的元素
优惠活动
大模型
产品
解决方案
定价
更多

如何在Angular+C#+Oracle项目中仅保存数组内被修改的元素

表格仅提交变更记录的实现方案

你当前项目单页最多加载120条记录,数据量极小,优先选择原始数据快照对比方案(也就是你提到的第一个思路),逻辑简单、边界场景覆盖完整,完全可以满足需求。

前端Angular侧实现

基础落地方案(推荐)

  • 页面初始化加载表格数据完成后,对全量原始数据做深拷贝,存储为originalTableData快照。注意不要直接赋值(会和当前表格数据共用引用),可以用JS原生structuredClone()方法,或者Lodash的_.cloneDeep()方法完成深拷贝。
  • 点击保存按钮时,遍历当前表格数据,和原始快照逐行、逐字段对比,筛选出变更记录:
// 排除不需要对比的字段,比如主键ID、创建时间等固定字段
const EXCLUDE_COMPARE_KEYS = ['id', 'createTime', 'creator'];

// 单条记录对比工具方法
function checkRecordChanged(original: Record<string, any>, current: Record<string, any>): boolean {
  const compareKeys = Object.keys(original).filter(key => !EXCLUDE_COMPARE_KEYS.includes(key));
  // 任意字段不一致即判定为变更
  return compareKeys.some(key => original[key] !== current[key]);
}

// 筛选变更记录
const changedRecords = currentTableData.filter(currentRecord => {
  const matchedOriginal = originalTableData.find(orig => orig.id === currentRecord.id);
  // 新增的无匹配原始值的记录,直接判定为变更
  if (!matchedOriginal) return true;
  return checkRecordChanged(matchedOriginal, currentRecord);
});

// 仅提交changedRecords到后端接口
  • 该方案天然支持用户修改后又改回原值的场景,120条数据的全量对比耗时不足1ms,完全不会影响交互体验。

优化方案(适配更大数据量场景)

如果你后续需要支持更大数据量的表格,可以优化你提到的第二个思路,解决改回原值的问题:

  • 每行数据绑定修改事件,每次用户修改任意字段后,实时和该行的原始快照做对比
  • 如果对比后该行所有字段和原始值一致,就把该行从变更列表中移除;如果不一致,就将该行加入/保留在变更列表中
  • 保存时直接提交变更列表即可,不需要全量遍历对比

后端C# + Oracle侧适配

  • 接口直接接收前端传递的变更记录列表即可,原有保存、更新逻辑不需要做大幅修改,仅减少了无效数据的传输和处理开销
  • 如果需要做并发控制,可以给业务表增加版本号字段,每次更新时判断前端传递的版本号和数据库当前版本号一致,才执行更新操作,避免覆盖其他用户的修改

注意事项

  • 深拷贝原始数据时如果涉及日期、二进制等特殊类型,要单独处理对比逻辑,避免出现类型转换导致的误判
  • 软删除的记录需要单独标记变更状态,纳入提交列表

内容的提问来源于stack exchange,提问作者Rodolfho Vargas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 19:03:03