Skip to main content

列表数据处理

本文档介绍如何使用 C# 脚本对列表返回的数据进行处理。

使用场景​

当需要对列表查询结果进行二次处理时,例如:

  • 计算字段值(如:日期差值、数值计算等)
  • 数据格式转换
  • 添加自定义字段
  • 数据过滤和排序
  • 数据关联处理

实现方式​

流程配置​

对列表返回的数据进行处理时,必须首先查询数据集合,即列表数据,然后使用脚本对列表数据进行处理。

典型的流程配置如下:

流程说明:

  1. 开始节点 - 流程入口
  2. 查询集合组件 - 查询数据列表,结果存储在 context.CmpResult 中
  3. C# 脚本组件 - 处理查询结果,修改列表数据
  4. 结束组件 - 流程结束,返回处理后的数据

示例代码​

以下示例演示如何计算两个日期字段的差值:

using System;
using System.Linq;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Chameleon.Common;
using Chameleon.Common.Context;
using Chameleon.Common.Exceptions;
using Chameleon.Common.Models;
using Chameleon.Database;
using Chameleon.SDK;

public class ChameleonCSharpScript
{
public string Execute(ComponentContext context, ChameleonSDK sdk)
{
var list = context.CmpResult as List<ObjectData>;

foreach(var item in list){
var date1 = Convert.ToDateTime(item["date1"]);
var date2 = Convert.ToDateTime(item["date2"]);
item["days"] = (date2 - date1).Days;
}

return null;
}
}

关键点说明​

1. context.CmpResult 属性​

context.CmpResult 属性是所有组件通用返回值:

  • 查询集合组件查询到的数据会存放在该属性中
  • 数据类型为 List<ObjectData>
  • 可以直接修改列表中的数据,修改会反映到最终返回结果

2. 数据修改​

  • 直接修改 ObjectData 对象的字段即可
  • 新增字段直接赋值:item["newField"] = value
  • 修改后的数据会自动传递到后续组件和最终返回结果

3. 返回值​

  • 返回 null 表示正常继续执行
  • 如需中断流程,可返回错误消息字符串

扩展示例​

示例1:计算字段值​

public string Execute(ComponentContext context, ChameleonSDK sdk)
{
var list = context.CmpResult as List<ObjectData>;

foreach(var item in list)
{
// 数值计算
var price = Convert.ToDecimal(item["price"]);
var quantity = Convert.ToInt32(item["quantity"]);
item["totalAmount"] = price * quantity;

// 日期计算
var startDate = Convert.ToDateTime(item["startDate"]);
var endDate = Convert.ToDateTime(item["endDate"]);
item["duration"] = (endDate - startDate).Days;
}

return null;
}

示例2:条件判断添加字段​

public string Execute(ComponentContext context, ChameleonSDK sdk)
{
var list = context.CmpResult as List<ObjectData>;

foreach(var item in list)
{
// 根据金额判断等级
var amount = Convert.ToDecimal(item["amount"]);
if (amount >= 10000)
{
item["level"] = "高";
item["color"] = "red";
}
else if (amount >= 5000)
{
item["level"] = "中";
item["color"] = "orange";
}
else
{
item["level"] = "低";
item["color"] = "green";
}
}

return null;
}

示例3:数据格式转换​

public string Execute(ComponentContext context, ChameleonSDK sdk)
{
var list = context.CmpResult as List<ObjectData>;

foreach(var item in list)
{
// 日期格式化
if (item.ContainsKey("createTime") && item["createTime"] != null)
{
var createTime = Convert.ToDateTime(item["createTime"]);
item["createTimeFormatted"] = createTime.ToString("yyyy-MM-dd HH:mm:ss");
}

// 状态转换
var status = Convert.ToInt32(item["status"]);
item["statusText"] = status switch
{
0 => "待审核",
1 => "已通过",
2 => "已拒绝",
_ => "未知"
};
}

return null;
}

示例4:数据过滤​

public string Execute(ComponentContext context, ChameleonSDK sdk)
{
var list = context.CmpResult as List<ObjectData>;

// 过滤掉无效数据
var validList = list.Where(item =>
{
var status = Convert.ToInt32(item["status"]);
return status == 1; // 只保留状态为1的数据
}).ToList();

// 更新返回结果
context.CmpResult = validList;

return null;
}

示例5:数据排序​

public string Execute(ComponentContext context, ChameleonSDK sdk)
{
var list = context.CmpResult as List<ObjectData>;

// 按金额降序排序
var sortedList = list.OrderByDescending(item =>
{
return Convert.ToDecimal(item["amount"]);
}).ToList();

// 更新返回结果
context.CmpResult = sortedList;

return null;
}

示例6:添加序号​

public string Execute(ComponentContext context, ChameleonSDK sdk)
{
var list = context.CmpResult as List<ObjectData>;

for (int i = 0; i < list.Count; i++)
{
list[i]["rowNumber"] = i + 1;
}

return null;
}

注意事项​

  1. 数据类型转换:从 ObjectData 中获取的值通常是 object 类型,需要进行适当的类型转换
  2. 空值检查:访问字段前建议检查字段是否存在和是否为空,避免空引用异常
  3. 性能考虑:如果数据量较大,注意脚本的执行效率
  4. 数据修改:直接修改列表中的数据会影响最终返回结果
  5. 过滤和排序:如果需要过滤或排序,需要将新列表赋值回 context.CmpResult

常见问题​

Q: 如何获取查询集合的数据?​

A: 使用 context.CmpResult as List<ObjectData> 获取查询结果列表。

Q: 修改后的数据会自动返回吗?​

A: 是的,直接修改列表中的数据,修改会自动反映到最终返回结果。

Q: 可以过滤数据吗?​

A: 可以,使用 LINQ 过滤后将新列表赋值回 context.CmpResult。

Q: 如何添加新字段?​

A: 直接给 ObjectData 对象赋值即可:item["newField"] = value。

相关文档​