C# 通过多个参数筛选c集合,其中一些参数可能为null
很抱歉,如果这是一个重复的问题,我发现了一些类似的问题,但没有一个可以解决我的问题。我有一个包含各种参数的对象集合,我想使用组合框和文本框中的数据对它们进行过滤C# 通过多个参数筛选c集合,其中一些参数可能为null,c#,linq,linq-to-objects,C#,Linq,Linq To Objects,很抱歉,如果这是一个重复的问题,我发现了一些类似的问题,但没有一个可以解决我的问题。我有一个包含各种参数的对象集合,我想使用组合框和文本框中的数据对它们进行过滤 var query = from zaj in zajezdy where zaj.Zeme == (String)zemeCombo.SelectedValue && zaj.Oblast == (String)oblast
var query = from zaj in zajezdy
where zaj.Zeme == (String)zemeCombo.SelectedValue
&& zaj.Oblast == (String)oblastCombo.SelectedValue
&& zaj.Stredisko == (String)strediskoCombo.SelectedValue
&& zaj.Doprava.Contains((String)dopravaCombo.SelectedValue)
&& zaj.Strava.Contains((String)stravaCombo.SelectedValue)
&& zaj.CenaOd > Int32.Parse(cenaOdText.Text)
&& zaj.CenaOd < Int32.Parse(cenaDoText.Text)
select zaj;
如果正确选择了所有组合,则此代码有效。但是,如果用户留下一些未选中/为空的对象,则返回的查询中没有对象。如何检测哪些参数为空,以便查询忽略它们?首先,尝试为每个combo\text引入单独的变量并使用它。使用String.IsNullOrEmpty检查字符串。还要尽量避免Type.Parse-改用Type.TryParse。样本:
var query = from c in dc.Customers select c;
//filter the result set based on user inputs
if ( !string.IsNullOrEmpty( countryFilter ) )
query = query.Where ( c=>c.Country == countryFilter );
if ( !string.IsNullOrEmpty( cityFilter ) )
query = query.Where ( c=>c.City == cityFilter );
我认为这是一个很好的用法示例 创建表示zajezd规范的对象:
public interface ISpecification<T>
{
bool IsSatisfiedBy(T value);
}
public class ZajezdSpecification : ISpecification<Zajezd>
{
private string _zeme;
private string _oblast;
private string _stredisko;
private string _doprava;
private string _strava;
private int _cenaOd;
private int _cenaDo;
public ZajezdSpecification(string zeme, string oblast, string stredisko,
string doprava, string strava, int cenaOd, int cenaDo)
{
_zeme = zeme;
_oblast = oblast;
_stredisko = stredisko;
_doprava = doprava;
_strava = strava;
_cenaOd = cenaOd;
_cenaDo = cenaDo;
}
public bool IsSatisfiedBy(Zajezd zajezd)
{
if (!String.IsNullOrEmpty(_zeme) && zajezd.Zeme != _zeme)
return false;
if (!String.IsNullOrEmpty(_oblast) && zajezd.Oblast != _oblast)
return false;
// ... verify anything you want
return _cenaOd < zajezd.CenaOd && zajezd.CenaOd < _cenaDo;
}
}
使用此规范筛选您的收藏:
var query = from zaj in zajezdy
where spec.IsSatisfiedBy(zaj)
select zaj;
PS尝试在代码中使用英文名称。您也可以这样过滤它们,具体取决于参数名称是否为空,然后返回所有项目,否则仅返回具有指定名称的元素:
myList.Where(x => name == null || x.Name == name)
.Where(x => id == null || x.Id == id);
我这样做了:stringoblast=StringoblastCombo.SelectedValue;var query=来自cestovnicancelar.GetInstance.zajezdy中的zaj,其中zaj.Zeme==StringzemeCombo.SelectedValue&!String.IsNullOrEmptyoblast&&zaj.Oblast==Oblast没有帮助,当Oblast为null时,查询仍然返回零项。使用String.IsNullOrEmptyoblastCombo.SelectedValue,就像在我的示例中一样这非常优雅,似乎工作正常,谢谢。对于变量命名,很抱歉。
myList.Where(x => name == null || x.Name == name)
.Where(x => id == null || x.Id == id);