列表数据处理
本文档介绍如何使用 C# 脚本对列表返回的数据进行处理。
使用场景
当需要对列表查询结果进行二次处理时,例如:
- 计算字段值(如:日期差值、数值计算等)
- 数据格式转换
- 添加自定义字段
- 数据过滤和排序
- 数据关联处理
实现方式
流程配置
对列表返回的数据进行处理时,必须首先查询数据集合,即列表数据,然后使用脚本对列表数据进行处理。
典型的流程配置如下:
流程说明:
- 开始节点 - 流程入口
- 查询集合组件 - 查询数据列表,结果存储在
context.CmpResult中 - C# 脚本组件 - 处理查询结果,修改列表数据
- 结束组件 - 流程结束,返回处理后的数据
示例代码
以下示例演示如何计算两个日期字段的差值:
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;
}
注意事项
- 数据类型转换:从 ObjectData 中获取的值通常是 object 类型,需要进行适当的类型转换
- 空值检查:访问字段前建议检查字段是否存在和是否为空,避免空引用异常
- 性能考虑:如果数据量较大,注意脚本的执行效率
- 数据修改:直接修改列表中的数据会影响最终返回结果
- 过滤和排序:如果需要过滤或排序,需要将新列表赋值回
context.CmpResult
常见问题
Q: 如何获取查询集合的数据?
A: 使用 context.CmpResult as List<ObjectData> 获取查询结果列表。
Q: 修改后的数据会自动返回吗?
A: 是的,直接修改列表中的数据,修改会自动反映到最终返回结果。
Q: 可以过滤数据吗?
A: 可以,使用 LINQ 过滤后将新列表赋值回 context.CmpResult。
Q: 如何添加新字段?
A: 直接给 ObjectData 对象赋值即可:item["newField"] = value。