C# EF查询数据库列表时如何处理入参为Null代表查询全部的需求
实现方案
核心逻辑是在每个筛选条件前增加参数非空判断,参数为null时对应条件自动跳过,不会参与过滤。
修改后的完整代码如下:
public JsonResult SearchApplicantList(string SSession, string ApStatus, string StudyLevel, string SLPrograms) { ab db = new ab(); var SearchList = db.Students .Where(x => // 学期参数为空则不过滤,否则匹配学期 (SSession == null || x.SemesterSessioin == SSession) // 申请状态参数为空则不过滤,否则匹配状态 && (ApStatus == null || x.OverAllStatus == ApStatus) // 学习层次参数为空则不过滤,否则匹配层次 && (StudyLevel == null || x.StudyLvl == StudyLevel) // 志愿匹配逻辑:参数为空则不过滤,否则要求四个志愿中任意一个匹配(原代码为&&,要求全匹配,可根据业务调整) && (SLPrograms == null || x.ProgPref1 == SLPrograms || x.ProgPref2 == SLPrograms || x.ProgPref3 == SLPrograms || x.progPref4 == SLPrograms)).ToList(); return Json(SearchList, JsonRequestBehavior.AllowGet); }
逻辑说明
- 每个条件用
(参数为null || 字段匹配参数)的格式,当参数为null时,该段整体返回true,不会对对应字段做筛选,完全符合需求。 - 原有代码中四个志愿的筛选用了
&&,要求四个志愿同时等于SLPrograms,不符合通常的志愿匹配逻辑,这里改成了||只要任意一个志愿匹配即可,你可以根据实际业务需求调整回&&。 - 这种写法EF会自动优化生成的SQL语句,参数为null的条件不会出现在最终执行的SQL里,不会有性能问题。
可选链式写法(适合筛选条件较多的场景)
public JsonResult SearchApplicantList(string SSession, string ApStatus, string StudyLevel, string SLPrograms) { ab db = new ab(); // 先拿到未过滤的查询对象 IQueryable<Student> query = db.Students; // 逐个判断参数,非空才加筛选条件 if (SSession != null) { query = query.Where(x => x.SemesterSessioin == SSession); } if (ApStatus != null) { query = query.Where(x => x.OverAllStatus == ApStatus); } if (StudyLevel != null) { query = query.Where(x => x.StudyLvl == StudyLevel); } if (SLPrograms != null) { query = query.Where(x => x.ProgPref1 == SLPrograms || x.ProgPref2 == SLPrograms || x.ProgPref3 == SLPrograms || x.progPref4 == SLPrograms); } // 执行查询拿到结果 var SearchList = query.ToList(); return Json(SearchList, JsonRequestBehavior.AllowGet); }
链式写法逻辑更清晰,条件多的时候更容易维护,生成的SQL和第一种写法完全一致,性能没有差异。
内容的提问来源于stack exchange,提问作者Zia UR Rahman
相关产品推荐
相关产品推荐

