我正在构建一个包含多个过滤器的报告页面,当用户选择0到all时,它会显示所有列,并过滤所有数据。我不确定在选择多个过滤器时如何加入过滤器。示例代码如下,我只发布了相关的代码,因为它非常冗长,而且控制器正在从模型中拉出来,这就是“问题调查模式”的问题所在。是来自。我确实找到了Filter/Search using Multiple Fields - ASP.NET MVC但是由于我已经编写过的可变问题,它要求我更改我的代码。谢谢!
控制器:
public ActionResult Reports(string JIssue, string Status)
{
string EX = "EX";
var Issues = db.Data.Select(i => new IssueViewModel { });
if (JIssue == "2"){
Issues = db.Data.Where(d => d.Column.Contains(EX)).Select(i => new IssueViewModel
{
Name = i.Name,
Description = i.Description,
Key = i.Key,
LastUpdate = i.LastUpdate,
ID = i.ID,
IssueType = i.IssueType,
ProgrammingStatus = i.ProgrammingStatus
}); }
if (Status == "2"){
Issues = db.Data.Where(d => d.Column2.Contains(1)).Select(i => new IssueViewModel
{
Name = i.Name,
Description = i.Description,
Key = i.Key,
LastUpdate = i.LastUpdate,
ID = i.ID,
IssueType = i.IssueType,
ProgrammingStatus = i.ProgrammingStatus
}); }
ViewBag.Issues = Issues.ToList();
return View();
查看:
@Html.DropDownList("JIssue", new List<SelectListItem> {
new SelectListItem { Text = "All", Value = "1", Selected = true},
new SelectListItem { Text = "EX", Value = "2"},
new SelectListItem { Text = "EXX", Value = "3"},
new SelectListItem { Text = "EZX", Value = "4"},
new SelectListItem { Text = "ABC", Value = "5"},
new SelectListItem { Text = "BCD", Value = "6"},
new SelectListItem { Text = "CDE", Value = "7"},
}, "Select Project")
答案 0 :(得分:0)
我看到了一些可能的改进。
1)JIssue
字符串是您的输入之一。在示例中,如果它是2
,那么您在EX
子句中检查Where
。
如果您按Text
搜索而不是Value
发送文字。这样您就可以排除if语句。 (我知道你对所有其他值都有更多if语句。)
所以你的第一次检查将归结为
Issues = db.Data.Where(d => d.Column.Contains(JIssue)).Select(...)
同样可以应用于状态。
2)在检查每个条件后,您将获得数据(通过执行Select
)。而是仅在运行所有Where
子句后请求数据。或者,在一个Where
块中包含所有条件。
所以这将归结为以下几点:
public ActionResult Reports(string JIssue, string Status)
{
var Issues = db.Data
.Where(d => d.Column.Contains(JIssue) &&
d.Column2.Contains(1) &&
/* potential other conditions for other columns*/ )
.Select(i => /* your mapping here */)
.ToList();
ViewBag.Issues = Issues;
return View();
}