问题描述
如何将以下查询合并到单个查询中?我认为多个if会不必要地增加代码复杂性。
var query = scenario.Where(x => x.ScenarioNumber == ScenarioNumber).Select(x => x).Distinct().ToList();
// Match exception number else return wild card entries.
if(query.Any(x=>x.ExcepNumber == ExcepNumber))
{
query = query.Where(x => x.ExcepNumber == ExcepNumber).ToList();
}
else
{
query = query.Where(x => x.ExcepNumber == "**").ToList();
}
// Match regime else return wild card entries.
if (query.Any(x => x.Regime == Regime))
{
query = query.Where(x => x.Regime == Regime).ToList();
}
else
{
query = query.Where(x => x.Regime == "**").ToList();
}
finalResponse = query.Select(x => x.TestColumn).Distinct().ToList();
解决方法
我有个建议。您可以将其提取到一个通用方法中,在该方法中将传递一个选择器函数,该函数指定要用于过滤的属性以及要比较的2个选择(当然还有集合)。
private List<T> EitherFilterOrWildCard<T>(Func<T,string> selector,string compare,string elseCompare,List<T> query)
{
var temp = query.Where(x => selector(x) == compare);
return temp.Any() ? temp.ToList() : query.Where(x => selector(x) == elseCompare).ToList();
}
您的if语句将缩小到这两行:
query = EitherFilterOrWildCard<MyClass>(x => x.ExcepNumber,ExcepNumber,"**",query);
query = EitherFilterOrWildCard<MyClass>(x => x.Regime,Regime,query);