【问题标题】:Asp.net mvc Linq query for multiple filtersAsp.net mvc Linq 查询多个过滤器
【发布时间】:2014-08-21 13:56:23
【问题描述】:

我正在开发一个 Asp.net MVC Razor 应用程序。 在我的应用程序视图中,我有一个过滤器栏,用户可以在其中输入过滤选项。

我想知道当用户输入多个城市作为“或”函数,以及当有多个邮政编码作为“与”函数时,是否有更简单的 linq 表达式。

例如:用户输入“纽约,蒙特利尔”,我必须检索这些城市的所有条目。

我有工作代码,但没有考虑用户是否会输入多个条目

代码:

string city = collection["city"];                    // Default value = "City"
        string postal = collection["postCode"];              // Default value = "Postal Code"
        string skill = collection["skillSet"];               // Default value = ""
        string category = collection["taskCategory"];        // Default value = ""
        string viewall = collection["viewAll"];              // Default value = null, when clicked = "View all"
        string status = collection["status"];                // Defualt Value = ""

        if (city != "City")
        {
            ViewBag.city = city;
        }
        if (postal != "Postal Code")
        {
            ViewBag.postal = postal;
        }
        ViewBag.skill = skill;
        ViewBag.category = category;
        ViewBag.status = status;

        var viewModel = new W6ViewModel();

        // Default list for the Tasks nand Engineers
        viewModel.engineers = db.W6ENGINEERS.OrderBy(n => n.Name).ToList();
        viewModel.tasks = db.W6TASKS.ToList();

        var keys = db.W6ENGINEERS.Select(v => v.W6Key).ToList();
        var engSkills = db.W6ENGINEERS_SKILLS.Where(v => v.W6SKILLS.Name == skill).Select(k => k.W6Key).ToList();

        //Filters for the Tasks & Engineer
        if (viewall != "View all")
        {
            if (city != "City" && postal != "Postal Code" && category == "" && skill == "" && status == "")
            {
                viewModel.tasks =
                    db.W6TASKS.Where(w => w.City == city).Where(v => v.PostCode.Contains(postal)).ToList();
                viewModel.engineers =
                    db.W6ENGINEERS.Where(w => w.City == city).Where(v => v.PostCode.Contains(postal)).ToList();
            }
            else if (city != "City" && postal != "Postal Code" && category == "" && skill == "" && status != "")
            {
                viewModel.tasks =
                    db.W6TASKS.Where(w => w.City == city).Where(v => v.PostCode.Contains(postal)).Where(s => s.W6TASK_STATUSES.Name == status).ToList();
                viewModel.engineers =
                    db.W6ENGINEERS.Where(w => w.City == city).Where(v => v.PostCode.Contains(postal)).ToList();
            }
            else if (city != "City" && postal != "Postal Code" && category != "" && skill != "" && status == "")
            {
                viewModel.tasks =
                    db.W6TASKS.Where(w => w.City == city)
                        .Where(v => v.PostCode.Contains(postal))
                        .Where(c => c.W6TASKTYPECATEGORY.Name == category)
                        .ToList();
                viewModel.engineers = db.W6ENGINEERS.Where(c => c.City == city).Where(p => p.PostCode.Contains(postal)).Where(k => engSkills.Contains(k.W6Key)).ToList();
            }
            else if (city != "City" && postal != "Postal Code" && category != "" && skill != "" && status != "")
            {
                viewModel.tasks =
                    db.W6TASKS.Where(w => w.City == city)
                        .Where(v => v.PostCode.Contains(postal))
                        .Where(c => c.W6TASKTYPECATEGORY.Name == category)
                        .Where(s => s.W6TASK_STATUSES.Name == status)
                        .ToList();
                viewModel.engineers = db.W6ENGINEERS.Where(c => c.City == city).Where(p => p.PostCode.Contains(postal)).Where(k => engSkills.Contains(k.W6Key)).ToList();
            }
            else if (city == "City" && postal != "Postal Code" && category != "" && skill != "" && status == "")
            {
                viewModel.tasks =
                    db.W6TASKS.Where(v => v.PostCode.Contains(postal))
                        .Where(c => c.W6TASKTYPECATEGORY.Name == category)
                        .ToList();
                viewModel.engineers =
                    db.W6ENGINEERS.Where((p => p.PostCode.Contains(postal)))
                        .Where(k => engSkills.Contains(k.W6Key))
                        .ToList();
            }
            else if (city == "City" && postal != "Postal Code" && category != "" && skill != "" && status != "")
            {
                viewModel.tasks =
                    db.W6TASKS.Where(v => v.PostCode.Contains(postal))
                        .Where(c => c.W6TASKTYPECATEGORY.Name == category)
                        .Where(s => s.W6TASK_STATUSES.Name == status)
                        .ToList();
                viewModel.engineers =
                    db.W6ENGINEERS.Where((p => p.PostCode.Contains(postal)))
                        .Where(k => engSkills.Contains(k.W6Key))
                        .ToList();
            }
            else if (city != "City" && postal == "Postal Code" && category != "" && skill != "" && status == "")
            {
                viewModel.tasks =
                    db.W6TASKS.Where(w => w.City == city).Where(c => c.W6TASKTYPECATEGORY.Name == category).ToList();
                viewModel.engineers =
                    db.W6ENGINEERS.Where(c => c.City == city).Where(k => engSkills.Contains(k.W6Key)).ToList();
            }
            else if (city != "City" && postal == "Postal Code" && category != "" && skill != "" && status != "")
            {
                viewModel.tasks =
                    db.W6TASKS
                    .Where(w => w.City == city).Where(c => c.W6TASKTYPECATEGORY.Name == category)
                    .Where(s => s.W6TASK_STATUSES.Name == status)
                    .ToList();
                viewModel.engineers =
                    db.W6ENGINEERS.Where(c => c.City == city).Where(k => engSkills.Contains(k.W6Key)).ToList();
            }
            else if (city != "City" && postal == "Postal Code" && category == "" && skill == "" && status == "")
            {
                viewModel.tasks =
                    db.W6TASKS.Where(w => w.City == city).ToList();
                viewModel.engineers =
                    db.W6ENGINEERS.Where(w => w.City == city).ToList();
            }
            else if (city != "City" && postal == "Postal Code" && category == "" && skill == "" && status != "")
            {
                viewModel.tasks =
                    db.W6TASKS.Where(w => w.City == city).Where(s => s.W6TASK_STATUSES.Name == status).ToList();
                viewModel.engineers =
                    db.W6ENGINEERS.Where(w => w.City == city).ToList();
            }
            else if (city == "City" && postal != "Postal Code" && category == "" && skill == "" && status == "")
            {
                viewModel.tasks =
                    db.W6TASKS.Where(v => v.PostCode.Contains(postal)).ToList();
                viewModel.engineers =
                    db.W6ENGINEERS.Where(v => v.PostCode.Contains(postal)).ToList();
            }
            else if (city == "City" && postal != "Postal Code" && category == "" && skill == "" && status != "")
            {
                viewModel.tasks =
                    db.W6TASKS.Where(v => v.PostCode.Contains(postal)).Where(s => s.W6TASK_STATUSES.Name == status).ToList();
                viewModel.engineers =
                    db.W6ENGINEERS.Where(v => v.PostCode.Contains(postal)).ToList();
            }
            else if (city == "City" && postal == "Postal Code" && category != "" && skill != "" && status == "")
            {
                viewModel.tasks =
                    db.W6TASKS.Where(c => c.W6TASKTYPECATEGORY.Name == category).ToList();
                viewModel.engineers = db.W6ENGINEERS.Where(k => engSkills.Contains(k.W6Key)).ToList();
            }
            else if (city == "City" && postal == "Postal Code" && category != "" && skill != "" && status != "")
            {
                viewModel.tasks =
                    db.W6TASKS.Where(c => c.W6TASKTYPECATEGORY.Name == category).Where(s => s.W6TASK_STATUSES.Name == status).ToList();
                viewModel.engineers = db.W6ENGINEERS.Where(k => engSkills.Contains(k.W6Key)).ToList();
            }
            else if (city == "City" && postal == "Postal Code" && category == "" && skill != "" && status == "")
                viewModel.engineers = db.W6ENGINEERS.Where(k => engSkills.Contains(k.W6Key)).ToList();
            else if (city == "City" && postal == "Postal Code" && category == "" && skill != "" && status != "")
            {
                viewModel.engineers = db.W6ENGINEERS.Where(k => engSkills.Contains(k.W6Key)).ToList();
                viewModel.tasks = db.W6TASKS.Where(s => s.W6TASK_STATUSES.Name == status).ToList();
            }
            else if (city == "City" && postal == "Postal Code" && category != "" && skill == "" && status == "")
                viewModel.tasks = db.W6TASKS.Where(c => c.W6TASKTYPECATEGORY.Name == category).ToList();
            else if (city == "City" && postal == "Postal Code" && category != "" && skill == "" && status != "")
            {
                viewModel.tasks = db.W6TASKS
                    .Where(c => c.W6TASKTYPECATEGORY.Name == category)
                    .Where(s => s.W6TASK_STATUSES.Name == status)
                    .ToList();
            }
            else if(city == "City" && postal == "Postal Code" && category == "" && skill == "" && status != "")
            {
                viewModel.tasks = db.W6TASKS.Where(s => s.W6TASK_STATUSES.Name == status).ToList();
            }
        }

感谢您的帮助。

【问题讨论】:

  • 您的问题不清楚是要处理逗号还是处理or。无论如何,我认为你应该看看expression trees
  • 处理“或”以及“和”谢谢我看看你的链接

标签: c# asp.net asp.net-mvc linq asp.net-mvc-4


【解决方案1】:

你需要的是一个 PredicateBuilder,我知道有一个可以处理 orAnd 对于这种情况,Fluentx 库有这个类,下面是一个示例使用它:

var predicate = PredicateBuilder.True<Customer>();

foreach (var product in products)
{
    predicate = predicate.And(c => c.Products.Any(x => x.Id == productId));
}

只需下载库并引用它并使用 PredicateBuilder 类。

【讨论】:

    猜你喜欢
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多