如何使用LINQ MVC基于AND条件应用搜索过滤

时间:2017-02-26 08:15:37

标签: c# asp.net-mvc linq search filtering

我正在开发asp.net-mvc项目

我想使用带有(AND条件)的LINQ基于参数(大多数是Veiw中的下拉列表)过滤记录,但我的问题是null或空参数。

有时用户过滤基于一个或两个字段的记录,其余字段值返回为空。那么没有结果符合条件。

目前我使用(OR条件)来获取想要的记录:

 $('#image_alt').on('click', function () {
        $('#sampleInput').click();
    });

观点:



 public ActionResult Search(int? ReportID, int? ReportName, int? Department, string ManagerConfirmationState1, string RiskLevel, string NoteType)
    {




        ViewBag.ReportID = new SelectList(db.Reports, "ReportID", "ReportID");
        ViewBag.ReportName = new SelectList(db.Reports, "ReportID", "ReportName");
        ViewBag.Department = new SelectList(db.Departments, "DepartmentID", "DepartmentName");
        ViewBag.ManagerConfirmationState1 = new SelectList(db.ManagerConfirmationState1, "ManagerConfirmationState1ID", "ManagerConfirmationState11");
        ViewBag.RiskLevel = new SelectList(db.RiskLevels, "RiskLevelID", "RiskLevel1");
        ViewBag.NoteType = new SelectList(db.NoteTypes, "NoteTypeID", "NoteType1");

        var Notes = from n in db.Notes
                    select n;


        //filteration

        Notes = Notes.Where(n => n.ReportID == ReportID
                                   || n.Report.ReportID == ReportName
                                   || n.Report.Department.DepartmentID == Department
                                   || n.ManagerConfirmationState1.Equals(ManagerConfirmationState1)
                                   || n.RiskLevel.Equals(RiskLevel)
                                   || n.NoteType.Equals(NoteType));




        return View(Notes.ToList());
    }




要点:

我可以在LINQ中使用忽略空输入来应用过滤吗?

有什么建议吗?

2 个答案:

答案 0 :(得分:6)

只需逐步构建查询:

if (field1.HasValue) {
  query = query.Where(x => x.Val1 = field1.Value);
}
if (field2.HasValue) {
  query = query.Where(x => x.Val2 = field2.Value);
}

(因为x.Where(y => cond1(y) && cond2(y))在功能上等同于x.Where(y => cond1(y)).Where(y => cond2(y))

答案 1 :(得分:0)

如果您要过滤的参数数量有限(或者甚至是一个可能为空或空的参数),您可以在使用AND时在查询中检查其值。

如果未提供过滤器值,则您需要选择所有(当前已过滤的)记录而不进一步过滤,否则您希望将过滤器值添加到当前过滤的记录中。

我将使用空值检查,因为您已经显示了可以为空的参数。

Notes = Notes.Where(n => 
(ReportId == null || n.ReportID == ReportID) 
&& (ReportName == null || n.Report.ReportName == ReportName) 
&& (Department == null || n.Report.Department.DepartmentID == Department) 
&& (ManagerConfirmationState1 == null || n.ManagerConfirmationState1.Equals(ManagerConfirmationState1)) 
&& (RiskLevel == null || n.RiskLevel.Equals(RiskLevel)) 
&& (NoteType == null || n.NoteType.Equals(NoteType))
);