C# - 如何在对象列表上执行多个包含过滤器

Kir*_*nen 3 c# linq datatable contains filter

我有一个数据表,我试图为列实现服务器端过滤.我允许每列查询多个字符串,并尝试确定跨步所有过滤器的最佳方法.下面是表对象的示例,为简单起见,只有2个参数.

//table models from db
public class Parts
{
    public string PartName { get; set; }
    public virtual Series Series { get; set; }
}

public class Series
{
    public string SeriesName { get; set; }
}

//This is what is passed in from the datatable filter query
public class PartsTable
{
    public string PartName { get; set; }

    public string SeriesName { get; set; }
}


public IEnumerable<Parts> PartsTableSearch(PartsTable table)
{
    //Queries come in as comma separated string
    var partNameList = table.PartName?.Split(',');
    var seriesNameList = table.SeriesName?.Split(',');

    //Gets and generates the list of Parts
    var fullList = GetParts();

    if (partNameList != null && partNameList.Length > 0)
    {        
        foreach (var partName in partNameList)
        {
            fullList = fullList.Where(p => p.PartName.ToLower().Contains(name.ToLower()));
        }
    }
    if (seriesNameList != null && seriesNameList.Length > 0)
    {
        foreach (var seriesName in seriesNameList)
        {
            fullList = fullList.Where(p => p.Series.SeriesName.ToLower().Contains(seriesName.ToLower()));
        }
    }

    return fullList;
}
Run Code Online (Sandbox Code Playgroud)

这对我想要的东西不起作用,因为对于每个参数(即PartName),我需要能够返回所有具有PartName包含partNameList中搜索字符串的对象,然后从该结果中进一步过滤SeriesNames包含seriesNameList中的搜索字符串,然后返回结果集.但是,partNameList的查询可能是空白的,只能搜索seriesName,反之亦然.有什么建议?我觉得这是一个明显的答案,我只是忽略了,虽然我搜索过的任何其他东西只适用于单个查询过滤器.提前致谢.

Cri*_*jak 5

这可以通过.Where2种方式单独完成:

使用.Contain()它将返回完全匹配:

public IEnumerable<Parts> PartsTableSearch(PartsTable table)
{
    //Queries come in as comma separated string
    var partNameList = table.PartName?.Split(',');
    var seriesNameList = table.SeriesName?.Split(',');

    //Gets and generates the list of Parts
    var fullList = GetParts()
        .Where(p => partNameList.Contains(p.PartName.ToLower())
            || seriesNameList.Contains(p.Series.SeriesName.ToLower()))
        .ToList();

    return fullList;
}
Run Code Online (Sandbox Code Playgroud)

使用.Any()它将返回部分匹配:

public IEnumerable<Parts> PartsTableSearch(PartsTable table)
{
    //Queries come in as comma separated string
    var partNameList = table.PartName?.Split(',');
    var seriesNameList = table.SeriesName?.Split(',');

    //Gets and generates the list of Parts
    var fullList = GetParts()
        .Where(p => partNameList.Any(n => n.Contains(p.PartName.ToLower())))
            || seriesNameList.Any(n => n.Contains(p.Series.SeriesName.ToLower())))
        .ToList();

    return fullList;
}
Run Code Online (Sandbox Code Playgroud)