我有以下代码正确返回如果我已经填充了所有四个字符串。但是,如果其中一个字符串为空,则返回的列表为空。基本上,我需要它来返回一个列表,即使一个或多个甚至所有字符串都是空的。
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();
}
提前致谢。
答案 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();
}