如何向LINQ Where子句添加多个Func<IDictionary<string,object>,bool>谓词?
解决LINQ Where子句多谓词仅最后一个生效的问题
你的问题出在循环过滤的逻辑上:每次执行filteredTransactions = transactionList.Where(filter).ToList();时,都是从原始的transactionList重新执行过滤,而不是在上一次过滤后的结果基础上继续筛选。这就导致之前的过滤结果被覆盖,最终只剩最后一个谓词生效。
两种可行的修复方案
方案一:逐步累积过滤(依次应用每个谓词)
初始化时先复制原始列表,之后每次都基于上一次的过滤结果继续筛选:
// 先把原始列表赋值给过滤结果 filteredTransactions = transactionList.ToList(); foreach (Func<IDictionary<string, object>, bool> filter in p) { // 在上一次过滤的结果上应用新的谓词 filteredTransactions = filteredTransactions.Where(filter).ToList(); }
方案二:合并所有谓词为一个(所有条件同时满足)
用Aggregate把多个谓词合并成一个逻辑上的**与(AND)**条件,只需要执行一次Where:
// 合并所有谓词,要求所有条件都满足 var combinedPredicate = p.Aggregate((currentFilter, nextFilter) => item => currentFilter(item) && nextFilter(item)); filteredTransactions = transactionList.Where(combinedPredicate).ToList();
如果需要的是**或(OR)**关系(满足任意一个谓词即可),把代码中的&&替换成||即可。
补充说明
两种方案的区别:
- 方案一适合需要按顺序逐步筛选的场景,比如前一个过滤的结果会影响后一个谓词的执行范围
- 方案二更高效,因为只需要遍历一次原始列表,适合所有谓词是并列条件的场景
内容的提问来源于stack exchange,提问作者K N
相关产品推荐
相关产品推荐

