Asp.net mvc Linq查询用于多个过滤器

14 浏览
0 Comments

Asp.net mvc Linq查询用于多个过滤器

我正在开发一个Asp.net MVC Razor应用程序。

在我的应用程序视图中,我有一个过滤栏,用户可以在其中输入过滤选项。

我想知道是否有一个更简单的linq表达式适用于用户输入多个城市作为“或”功能,以及多个邮政编码作为“和”功能的情况。

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

我有一个可以工作的代码,但它不考虑用户是否输入多个条目。

代码:

string city = collection["city"];                    // 默认值 = "城市"
        string postal = collection["postCode"];              // 默认值 = "邮政编码"
        string skill = collection["skillSet"];               // 默认值 = ""
        string category = collection["taskCategory"];        // 默认值 = ""
        string viewall = collection["viewAll"];              // 默认值 = null,当点击时 = "查看所有"
        string status = collection["status"];                // 默认值 = ""
        if (city != "城市")
        {
            ViewBag.city = city;
        }
        if (postal != "邮政编码")
        {
            ViewBag.postal = postal;
        }
        ViewBag.skill = skill;
        ViewBag.category = category;
        ViewBag.status = status;
        var viewModel = new W6ViewModel();
        // Tasks和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();
        // 任务和工程师的过滤器
        if (viewall != "查看所有")
        {
            if (city != "城市" && postal != "邮政编码" && 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 != "城市" && postal != "邮政编码" && 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 != "城市" && postal != "邮政编码" && 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 != "城市" && postal != "邮政编码" && 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 == "城市" && postal != "邮政编码" && 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 == "城市" && postal != "邮政编码" && 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 != "城市" && postal == "邮政编码" && 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 != "城市" && postal == "邮政编码" && 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 != "城市" && postal == "邮政编码" && 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 != "城市" && postal == "邮政编码" && 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 == "城市" && postal != "邮政编码" && 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 == "城市" && postal != "邮政编码" && 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 == "城市" && postal == "邮政编码" && 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 == "城市" && postal == "邮政编码" && 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 == "城市" && postal == "邮政编码" && category == "" && skill != "" && status == "")
                viewModel.engineers = db.W6ENGINEERS.Where(k => engSkills.Contains(k.W6Key)).ToList();
            else if (city == "城市" && postal == "邮政编码" && 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 == "城市" && postal == "邮政编码" && category != "" && skill == "" && status == "")
                viewModel.tasks = db.W6TASKS.Where(c => c.W6TASKTYPECATEGORY.Name == category).ToList();
            else if (city == "城市" && postal == "邮政编码" && category != "" && skill == "" && status != "")
            {
                viewModel.tasks = db.W6TASKS
                    .Where(c => c.W6TASKTYPECATEGORY.Name == category)
                    .Where(s => s.W6TASK_STATUSES.Name == status)
                    .ToList();
            }
            else if(city == "城市" && postal == "邮政编码" && category == "" && skill == "" && status != "")
            {
                viewModel.tasks = db.W6TASKS.Where(s => s.W6TASK_STATUSES.Name == status).ToList();
            }
        }

感谢您的帮助。

0
0 Comments

在ASP.NET MVC中,当需要使用多个过滤条件进行LINQ查询时,可能会遇到以下问题。为了解决这个问题,可以使用PredicateBuilder类。可以使用Fluentx库中的PredicateBuilder类来处理这种情况。以下是使用PredicateBuilder的示例代码:

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

只需下载Fluentx库并将其引用,然后使用PredicateBuilder类即可解决这个问题。

0