我有一个数据集,需要对多列(总共六列)进行过滤。并非每一列都会被过滤,即用户可以过滤第 1 列和第 3 列,但不能过滤第 2、4、5 或 6 列。当每列中只有一个值时,我可以成功过滤。然而,一旦一列有多个过滤器,它就会失败。
使用我想要过滤多个 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
foreach (string currentItem in pocitemsArray)//Checking for each POC
{
filteredIssues = filteredIssues.Where(s => s.PocName1.Contains(currentItem) || s.originatorPocName.Contains(currentItem));
}
}
if (filterColumnNotification == "Y")
{
notificationitemsArray = filterItemsNotification.Split(',');
foreach (string currentItem in notificationitemsArray)
{
filteredIssues = filteredIssues.Where(s => s.notificationType.Contains(currentItem));
}
}
问题是,当我过滤第一个 POC 时,第二次通过时,第二个 POC 不会有任何匹配项,因此没有返回记录。
如果我尝试匹配初始数据集(
issuelist
),它会起作用,但是我无法将一个过滤器级联到下一个过滤器。即过滤 POC 数据集,然后将过滤后的数据集发送到通知进行过滤。请记住,总共有 6 个过滤器循环,但并非所有循环都可以同时使用。
问题是您对每个过滤器中的所有值使用单独的
Where
:连续的 Where
语句相当于执行 condition1 && condition2
实际上,该列必须同时具有所有值才能不被删除。这就是为什么当过滤器中有一个可能的值时您会得到结果,但当过滤器中有多个值时却不会得到结果。它相当于
if (x == values[0] && x == values[1])
您可以重写过滤以在
Any
中使用 Where
而不是 foreach
:
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
filteredIssues = filteredIssues.Where(issue => // For every issue
pocitemsArray.Any(filter => // For ANY filter
issue.PocName1.Contains(filter) // Match
|| issue.originatorPocName.Contains(filter)));
}
if (filterColumnNotification == "Y")
{
notificationitemsArray = filterItemsNotification.Split(',');
filteredIssues = filteredIssues.Where(issue => // For every issue
notificationitemsArray.Any(filter => // For ANY filter
issue.notificationType.Contains(filter)); // Match
}