Asp.net mvc Linq查询用于多个过滤器
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(); } }
感谢您的帮助。
在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类即可解决这个问题。