使用多个过滤器MVC进行过滤

时间:2016-09-12 00:07:56

标签: c# asp.net-mvc

Reports Page

我正在构建一个包含多个过滤器的报告页面,当用户选择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")

1 个答案:

答案 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();
}