C# 多参数查询时如何忽略空参数实现动态组合过滤
问题根因
你当前代码无法实现多参数组合过滤的核心原因是使用了else if分支逻辑:只要任意一个前置条件命中,后续的参数判断就会直接跳过,自然只能生效单参数过滤规则。
另外你现在的实现是先把全表数据查询到内存后再做过滤,数据量较大时会有严重性能问题,建议把过滤逻辑放到数据库查询阶段执行。
优化后代码
[HttpGet] public ActionResult Get(string Id = null, string name = null, string status = null, string startDate = null, string endDate = null) { // 先构造IQueryable查询,此时还未实际执行数据库查询 IQueryable<ReportModel> query = _context.ReportData.Select(data => new ReportModel { Id = data.Id, Name = data.Plant, Status = data.Status, Date = data.Date }); // 独立判断每个参数,非空就追加过滤条件,支持多条件叠加 if (!string.IsNullOrEmpty(name)) { query = query.Where(asd => asd.Name == name); } if (!string.IsNullOrEmpty(Id)) { query = query.Where(x => x.Id == Id); } if (!string.IsNullOrEmpty(status)) { query = query.Where(x => x.Status == status); } // 日期参数处理,先判断非空再做转换追加条件 if (!string.IsNullOrEmpty(startDate) && DateTime.TryParse(startDate, out DateTime startDt)) { query = query.Where(x => x.Date >= startDt); } if (!string.IsNullOrEmpty(endDate) && DateTime.TryParse(endDate, out DateTime endDt)) { // 结束日期加1天,实现<=endDate的效果,避免时间精度问题漏掉数据 query = query.Where(x => x.Date < endDt.AddDays(1)); } // 最后统一排序+执行查询,只返回符合条件的数据 var report = query.OrderBy(x => x.Id).ToList(); return Ok(report); }
实现说明
- 把所有
else if改为独立的if判断,每个非空参数都会追加对应的Where条件,自动实现多参数的AND组合效果 - 基于
IQueryable的延迟查询特性,所有过滤条件会拼接成SQL语句在数据库端执行,避免拉取全表数据到内存过滤,性能提升明显 - 增加了日期参数的合法性校验,避免非法日期格式导致的程序异常
- 统一在最后执行排序和查询,避免多次重复排序、ToList的性能损耗
- 修正了你原代码中属性名大小写不一致的问题,原代码判断条件里写的
asd.name和定义的Name属性大小写不一致,避免匹配失败
内容的提问来源于stack exchange,提问作者ma32112345
相关产品推荐
相关产品推荐

