使用sqlite-pcl查询返回的对象列表中整数grade字段按值替换为对应字符串的问题
整数等级字段转固定展示字符串的实现方案
针对这个没有独立映射表、需要把整型grade字段值替换为对应奖章名称的场景,有两种不需要改动现有数据库结构的可落地方案:
方案1:在SQL查询层直接完成转换
SQLite 原生支持CASE条件分支语法,你可以直接在查询语句中完成值转换,查询返回的结果就是可直接展示的字符串内容,连后续的内存处理步骤都可以省略:
SELECT -- 原表中其他需要展示的字段按原有逻辑正常读取 *, -- 对整型grade字段做条件映射 CASE grade WHEN 0 THEN 'Platinum' WHEN 1 THEN 'Silver' ELSE 'Unknown' END AS grade FROM 目标数据表名
这种方式的适配成本极低,只要把实体类中原先定义为整型的grade字段类型改成字符串,sqlite-pcl 就会自动把转换后的字符串值绑定到对应属性上,不需要额外调整业务逻辑。
方案2:在代码内存层做固定字典映射
如果不想改动原有SQL查询逻辑,也可以在拿到查询结果后,通过静态字典完成值映射,这种方式后续调整等级对应规则时,不需要改动SQL语句,灵活性更高:
- 先在代码中定义全局可复用的固定映射字典:
private static readonly Dictionary<int, string> GradeMap = new Dictionary<int, string> { { 0, "Platinum" }, { 1, "Silver" } // 后续新增等级规则直接在这里追加条目即可 }; - 遍历sqlite-pcl返回的原始对象列表,逐行完成映射:
// 假设sqlite-pcl返回的原始结果集为rawQueryList,实体类的整型等级字段为Grade var displayList = rawQueryList.Select(item => new GradeDisplayModel { // 其他原有展示字段直接透传 RecordId = item.RecordId, // 等级字段做值映射,同时对无匹配的异常值做兜底处理 GradeText = GradeMap.TryGetValue(item.Grade, out var gradeName) ? gradeName : "Unknown" }).ToList();
实现注意事项
- 这类固定、极少变动的枚举映射关系,不需要为了它专门建立数据库关联表,额外维护表结构反而会增加不必要的查询开销和维护成本。
- 映射逻辑一定要增加兜底判断,避免数据库中出现未定义的整数值(比如异常写入的越界值)时直接触发程序异常。
内容的提问来源于stack exchange,提问作者Muhammad Radwan
相关产品推荐
相关产品推荐

