如何基于多数据集填充ClientMessage复杂类型列表的嵌套成员?
高效填充嵌套复杂类型ClientMessage列表的方案
既然存储过程返回的三个数据集已经是亚秒级的,那性能瓶颈大概率在内存中的数据关联逻辑上——26000行数据不算小,嵌套循环会拖慢速度,所以核心思路是先给辅助数据建立快速索引,再批量关联填充。
步骤1:将数据集加载到内存对象
先把三个数据集转换成对应的内存集合(以C#为例,其他语言逻辑通用):
- 主数据:
List<ClientMessage> clientMessages(从tmpMsgResult映射,此时嵌套的MsgText和ClientMessageDeeplinkResponse列表为空) - Deeplink辅助数据:
List<ClientMessageDeeplinkResponse> deeplinkItems(从tmpDeeplinkResult映射) - 文本字典数据:
List<MsgTextEntry> msgTextItems(假设tmpMsgTxt包含MessageId、Key、Value三个字段,用来映射到ClientMessage的MsgText字典)
步骤2:为辅助数据构建高效索引
为了避免O(n*m)的嵌套循环,用字典做O(1)快速查找的索引,把关联字段作为Key:
// 按MessageId分组构建Deeplink索引 var deeplinkLookup = deeplinkItems .GroupBy(item => item.MessageId) .ToDictionary(g => g.Key, g => g.ToList()); // 按MessageId分组构建MsgText字典索引 var msgTextLookup = msgTextItems .GroupBy(item => item.MessageId) .ToDictionary( g => g.Key, g => g.ToDictionary(txt => txt.Key, txt => txt.Value) );
步骤3:批量关联填充嵌套成员
遍历主数据列表,通过索引快速匹配并填充嵌套字段:
foreach (var msg in clientMessages) { // 填充ClientMessageDeeplinkResponse列表 if (deeplinkLookup.TryGetValue(msg.MessageId, out var deeplinks)) { msg.ClientMessageDeeplinkResponse = deeplinks; } else { msg.ClientMessageDeeplinkResponse = new List<ClientMessageDeeplinkResponse>(); // 空列表兜底,避免空引用 } // 填充MsgText字典 if (msgTextLookup.TryGetValue(msg.MessageId, out var textDict)) { msg.MsgText = textDict; } else { msg.MsgText = new Dictionary<string, string>(); // 空字典兜底 } }
关键优化细节
- 索引优先:字典的O(1)查找比嵌套循环高效数倍,26000行数据下性能差异会非常明显
- 避免重复枚举:辅助数据只做一次分组索引,不要在遍历主数据时重复查询
- 空值兜底:确保没有关联数据时,嵌套成员不会为null,避免后续业务逻辑出现空引用异常
如果用其他语言(Java/Python等),思路完全一致:Java用HashMap做分组索引,Python用dict配合分组逻辑实现即可。
内容的提问来源于stack exchange,提问作者BossRoss
相关产品推荐
相关产品推荐

