多个IF/CASE语句的替代方案

Chr*_*mut 0 c# asp.net-mvc if-statement switch-statement

有没有办法避免在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();
               }
            }
Run Code Online (Sandbox Code Playgroud)

调节器

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());
        }
    }
Run Code Online (Sandbox Code Playgroud)

Rob*_*don 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);
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以组合这两个构建器,以在控制器中创建您想要的任何逻辑条件.

祝好运.