有没有办法在C#中避免多个IF / CASE语句?
在我的应用程序中,我最终将有8个以上的字段用于创建Linq查询,其中每个表达式都可以为null或!= null,因此它将为我提供64个场景。
我没有提供任何代码示例,因为我可以使用IF / CASE并尽可能地简化它。
如果您熟悉该问题的一些有用方法,我将不胜感激。
代码示例(它只包含两个代理,但我必须添加更多内容来过滤数据)
存储库
public virtual IEnumerable<T> Get(Expression<Func<T, bool>> filter = null, Expression<Func<T, bool>> filter1 = null)
{
IQueryable<T> query = dbSet;
if (filter != null)
{
query = query.Where(filter);
return query.ToList();
}
if (filter1 != null)
{
query = query.Where(filter1);
return query.ToList();
}
else
{
return query.ToList();
}
}
控制器
public ActionResult Index(string searchFullName, string searchExtension)
{
var extensionList = new List<string>();
var extensions = from n in unitofwork.DomainRepository.Get()
select n.Extension;
extensionList.AddRange(extensions.Distinct());
ViewBag.searchExtension = new SelectList(extensionList);
if (!String.IsNullOrEmpty(searchFullName) && !String.IsNullOrEmpty(searchExtension))
{
return View(unitofwork.DomainRepository.Get(n => n.Extension == searchExtension && n.Name.Contains(searchFullName)));
}
else if (!String.IsNullOrEmpty(searchExtension))
{
return View(unitofwork.DomainRepository.Get(n => n.Extension == searchExtension));
}
else if (String.IsNullOrEmpty(searchFullName) && String.IsNullOrEmpty(searchExtension))
{
return View(unitofwork.DomainRepository.Get());
}
else if (!String.IsNullOrEmpty(searchFullName) && String.IsNullOrEmpty(searchExtension))
{
return View(unitofwork.DomainRepository.Get(n => n.Name.Contains(searchFullName)));
}
else
{
return View(unitofwork.DomainRepository.Get());
}
}
答案 0 :(得分:5)
是的,可以使用Linq强大的Aggregate
方法(函数式编程中fold
函数的一个版本)。
public virtual IEnumerable<T> FilterOnAll(params Expression<Predicate<T> filters)
{
return filters.Aggregate(dbSet, (acc, element) => acc.Where(element));
}
public virtual IEnumerable<T> FilterOnAny(params Expression<Predicate<T> filters)
{
Expression<Predicate<T>> alwaysTrue = _ => true;
var compositeFilter = filters.Aggregate(alwaysTrue, (acc, element) => acc.Or(element));
return dbSet.Where(compositeFilter);
}
然后,您可以编写这两个构建器,以便在控制器中创建所需的任何逻辑条件。
祝你好运。答案 1 :(得分:1)
您可以在where子句中使用或声明
where (variable1 == null || b.data = variable1)
并且如果我理解你的问题,如果我的问题是null,那么它只会对它进行检测为真,否则它会检查数据。
答案 2 :(得分:1)
您的整个if .. elseif .. else
块可以替换为:
return View(unitofwork.DomainRepository.Get(n =>
(string.IsNullOrEmpty(searchFullName) || n.Name.Contains(searchFullName))
&& (string.IsNullOrEmpty(searchExtension) || n.Extension == searchExtension)));