多个过滤器LINQ搜索C#

Mas*_*ick 0 c# linq

如果我填充了所有四个字符串,我有以下代码正确返回.但是,如果其中一个字符串为空,则返回的列表为空.基本上,我需要它返回一个列表,即使一个或多个甚至所有字符串都是空的.

private List<Search> FilterSearchResults(List<Search> results)
    {
        string _dataType = cmbISDataType.SelectedItem.ToString();
        string _medium = cmbISMedium.SelectedItem.ToString();
        string _pStatus = cmbISPStatus.SelectedItem.ToString();
        string _rStatus= cmbISRStatus.SelectedItem.ToString();

        return results
            .Where(a => a.Data_Type == _dataType && !string.IsNullOrWhiteSpace(_dataType))
            .Where(b => b.Medium == _medium && !string.IsNullOrWhiteSpace(_medium))
            .Where(c => c.PStat== _pStatus && !string.IsNullOrWhiteSpace(_pStatus ))
            .Where(d => d.RStatus== _rStatus && !string.IsNullOrWhiteSpace(_rStatus))
            .ToList();
    }
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Rag*_*lly 6

您当前的条件指定任何字符串不能为空或空,这就是列表返回为空的原因.Linq中的where子句通过返回集合中满足指定条件的任何对象来工作.如果您要简单地指定条件:

results.Where(true);
Run Code Online (Sandbox Code Playgroud)

将返回所有对象.

对于null或空检查,使用OR而不是AND将返回列表中对任一条件计算为true的任何对象.因此,如果过滤器字符串为空,则将返回所有对象,否则将仅返回满足其他条件的对象.

将您的过滤器更新为:

return results
            .Where(a => a.Data_Type == _dataType || string.IsNullOrWhiteSpace(_dataType))
            .Where(b => b.Medium == _medium || string.IsNullOrWhiteSpace(_medium))
            .Where(c => c.PStat== _pStatus || string.IsNullOrWhiteSpace(_pStatus ))
            .Where(d => d.RStatus== _rStatus || string.IsNullOrWhiteSpace(_rStatus))
            .ToList();
Run Code Online (Sandbox Code Playgroud)


Ser*_*rvy 5

而不是在循环的每次迭代中检查该值是否为null,仅在字符串不为null时执行检查:

private List<Search> FilterSearchResults(List<Search> results)
{
    string _dataType = cmbISDataType.SelectedItem.ToString();
    string _medium = cmbISMedium.SelectedItem.ToString();
    string _pStatus = cmbISPStatus.SelectedItem.ToString();
    string _rStatus = cmbISRStatus.SelectedItem.ToString();

    IEnumerable<Search> query = results;
    if (!string.IsNullOrWhiteSpace(_dataType))
        query = query.Where(a => a.Data_Type == _dataType);
    if (!string.IsNullOrWhiteSpace(_medium))
        query = query.Where(b => b.Medium == _medium);
    if( !string.IsNullOrWhiteSpace(_pStatus))
        query = query.Where(c => c.PStat == _pStatus);
    if( !string.IsNullOrWhiteSpace(_rStatus))
        query = query.Where(d => d.RStatus == _rStatus);
    return query.ToList();
}
Run Code Online (Sandbox Code Playgroud)