创建在单列上使用多个筛选器和使用筛选器的多个列的 LINQ 查询

问题描述 投票:0回答:1

我有一个数据集,需要对多列(总共六列)进行过滤。并非每一列都会被过滤,即用户可以过滤第 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 个过滤器循环,但并非所有循环都可以同时使用。

c# linq
1个回答
0
投票

问题是您对每个过滤器中的所有值使用单独的

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
}
© www.soinside.com 2019 - 2024. All rights reserved.