谁能给我建议一下,我应该使用哪种设计模式来处理一个搜索函数的多个if条件。
搜索功能采用产品的名称、类型和位置。在我的处理程序中,我使用if条件处理输入,如下例所示。
if(!string.isNullOrEmpty(ProductName) && !string.isNullOrEmpty(ProductType))
{
//Query product and retrun base on name and type.
var product = database.product.where(x=>x.productname == productname).where(x=>x.producttype == producttype).ToList()
} else if(!string.isNullOrEmpty(ProductName)
&& !string.isNullOrEmpty(ProductType)
&& !string.isNullOrEmpty(ProductLocation)){
//Query product and return base on name and location.
var product = database.product.where(x=>x.productname == productname).where(x=>x.ProductLocation == ProductLocation).ToList()
}
因此,我最终在处理程序中有了倍数if条件。代码开始变得越来越大。将来,当我可能有新类型的输入。特别是,每个if条件将具有相同的查询功能,并且只有在条件基于输入添加或删除的情况下才具有相同的查询功能。
有没有更好的方法来处理输入和删除重复的查询函数?
这不是设计模式,而是使用LINQ时常用的方法
var query = database.product.AsQueryable();
if (!string.IsNullOrEmpty(productName))
query = database.product.Where(x => x.productname == productname);
if (!string.IsNullOrEmpty(productType))
query = database.product.Where(x => x.producttype == producttype);
var product = query.ToList();
或通过helper函数:
public static class MyQuerybaleExtensions
{
public staic IQueryble<T> WhereIf<T>(this IQueryable<T> source, bool condiion, Expression<Func<T, bool> predicate)
{
if (condition)
source = source.Where(predicate);
return source;
}
}
var product = database.product
.WhereIf(!string.IsNullOrEmpty(productName), x => x.productname == productname)
.WhereIf(!string.IsNullOrEmpty(productType), x => x.producttype == producttype)
.ToList();