如何编写支持单列多条件与多列过滤的LINQ查询?
问题分析
你当前的代码逻辑存在核心问题:处理多值过滤时,循环叠加Where条件会把多个过滤规则变成**“同时满足”的关系,而非你需要的“满足任意一个”**。比如POC列表有A和B时,代码会先筛选出包含A的数据,再在该结果里找包含B的,最终只有同时包含A和B的数据才会被保留,这和“匹配任意一个POC”的预期完全相反,所以第二次过滤后无数据返回。
解决方案
把循环叠加Where的写法改成用Any()判断当前数据是否匹配任意一个过滤项,既能实现单/多值过滤的统一逻辑,又能保留多列的级联过滤(先POC再通知类型,或其他组合)。
修改后的代码如下:
IEnumerable<IssueDataModel> filteredIssues = issueList;//Passed in dataset var pocitemsArray = Array.Empty<string>(); var notificationitemsArray = Array.Empty<string>(); if (filterColumnPOCs == "Y")//This indicates the user has selected the POC Filter { pocitemsArray = filterItemsPOCs.Split(';');//This is the string of users to filter on // 用Any判断是否匹配任意一个POC项 filteredIssues = filteredIssues.Where(s => pocitemsArray.Any(item => s.PocName1.Contains(item) || s.originatorPocName.Contains(item))); } if (filterColumnNotification == "Y") { notificationitemsArray = filterItemsNotification.Split(','); // 同理处理通知类型的多值过滤 filteredIssues = filteredIssues.Where(s => notificationitemsArray.Any(item => s.notificationType.Contains(item))); }
逻辑说明
pocitemsArray.Any(item => ...):遍历所有POC过滤项,只要当前数据的PocName1或originatorPocName包含任意一个项,就保留这条数据- 多列级联过滤逻辑正常生效:如果同时开启POC和通知类型过滤,会先筛选出符合POC条件的数据,再在该结果里筛选符合通知类型条件的数据,完全符合需求
- 单值/多值过滤通用:不管过滤项是1个还是多个,该逻辑都能正常工作,无需额外判断数量
内容的提问来源于stack exchange,提问作者FlyFish
相关产品推荐
相关产品推荐

