【问题标题】:Multiple filter LINQ search C#多个过滤器 LINQ 搜索 C#
【发布时间】:2015-03-02 22:05:59
【问题描述】:

如果我填写了所有四个字符串,我有以下代码可以正确返回。但是,如果这些字符串之一为空,则返回的列表为空。基本上,即使有 1 个或更多甚至所有字符串为空,我也需要它返回一个列表。

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

提前致谢。

【问题讨论】:

  • 如果所有字符串都为空,列表中应该包含什么?如果其中两个是空的,两个不是?
  • 仅供参考,另请参阅 stackoverflow.com/questions/5188780/… 以讨论是否链接 Where 子句或仅使用 &amp;&amp; 更好。
  • @NadiaChibrikova 如果所有字符串为空,我希望它返回相同的结果。

标签: c# linq


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    results.Where(true);
    

    将返回所有对象。

    对 is null 或 empty 检查使用 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();
    

    【讨论】:

    • 这工作得很好,但是我接受了@Servy 的响应,因为它更有效率,并且只检查字符串是否为空。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    相关资源
    最近更新 更多