我正在开发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中使用忽略空输入来应用过滤吗?
有什么建议吗?
答案 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))
);