多个过滤器LINQ搜索C#

时间:2015-03-02 22:05:59

标签: 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();
    }

提前致谢。

2 个答案:

答案 0 :(得分:5)

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

results.Where(true);

将返回所有对象。

对于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();

答案 1 :(得分:4)

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

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();
}