基于另一列表条件过滤目标集合,LINQ多条件过滤结果异常如何解决?
代码问题分析与修复方案
原代码存在的核心问题
- 匹配逻辑完全颠倒:你需要筛选「客户端提交的、数据库中不存在的条目」,核心判断规则是不存在任何一个数据库条目,和当前客户端条目的三个标识字段完全相等。但你的代码逻辑是遍历每个客户端条目时,去数据库列表里找和当前客户端条目不匹配的数据库条目,完全搞反了对比的主体对象。
- 结果被反复覆盖:你在
ForEach循环里每次都给result重新赋值,最终result只会保留最后一个客户端元素对应的过滤后的数据库列表内容,完全没有收集你需要的客户端侧新增条目。 - 性能隐患:嵌套遍历的时间复杂度是O(n*m),数据量超过千级就会出现明显的性能损耗。
修复方案
小数据量直接用LINQ实现
直接按需求写过滤逻辑即可,代码如下:
List<BalanceQuery> result = clientList .Where(y => !dbList.Any(x => x.BankCode == y.BankCode && x.Agency == y.Agency && x.AccountNumber == y.AccountNumber)) .ToList();
大数据量优化方案
先给存量数据库列表构造唯一键的哈希集合,把查询复杂度降到O(1),性能提升非常明显:
// 构造存量数据的唯一键集合,分隔符建议用不会出现在三个字段中的特殊字符,避免键碰撞 HashSet<string> existingKeys = new HashSet<string>( dbList.Select(x => $"{x.BankCode}|{x.Agency}|{x.AccountNumber}") ); // 过滤客户端数据,键不在集合中的就是数据库不存在的新增条目 List<BalanceQuery> result = clientList .Where(y => !existingKeys.Contains($"{y.BankCode}|{y.Agency}|{y.AccountNumber}")) .ToList();
内容的提问来源于stack exchange,提问作者jvbs
相关产品推荐
相关产品推荐

