如何优化表格多字段搜索功能 减少多余if判断的实现方案
多字段组合搜索简化实现方案
核心思路是独立判断每个筛选条件,逐个追加查询约束,完全不需要穷举所有条件组合,n个筛选条件最多只需要n个if语句,不管多少种筛选组合都不需要写组合判断逻辑。

核心实现逻辑
- 初始查询先拿到全量的待筛选数据源(如果是EF等ORM场景,先不要调用
ToList,保持IQueryable延迟加载特性,避免提前查询全表) - 每个筛选条件单独判断:只要用户选择/输入了该条件的有效值,就追加对应的
Where查询约束 - 所有条件判断完成后再执行查询获取最终结果
优化后代码示例
后端C#逻辑
// 1. 初始化基础查询 var query = fraindList.AsQueryable(); // 2. 逐个追加筛选条件 // 项目ID筛选 if (hesabrsee.Projectid != 0) { query = query.Where(p => p.Projectid == hesabrsee.Projectid); } // 多状态筛选优化(解决你原有逻辑错误:同一状态字段不可能同时等于两个值,改用集合包含匹配多选状态) var selectedStates = new List<int>(); if (red != 0) { selectedStates.Add(red); ViewBag.red = "checked"; } if (yealoo != 0) { selectedStates.Add(yealoo); ViewBag.yealoo = "checked"; } if (selectedStates.Any()) { query = query.Where(p => selectedStates.Contains(p.ControlState)); } // 后续其他筛选条件都可以按这个格式扩展,比如日期、项目名称等 // if (输入值 != 无效默认值) { query = query.Where(对应的筛选约束); } // 3. 执行查询返回结果 return View(query.ToList());
前端表单代码
<div class="col-md-4 col-xs-12"> <label>项目名称</label> <select class="form-control" id="form_frame" name="Projectid"> <option value="" default="" selected="">请选择</option> @foreach (var item in ViewBag.proList) { <option value="@item.projectID">@item.projectName</option> } </select> </div>
额外优化建议
- 如果使用EF Core等ORM框架,链式追加
Where的方式会自动将所有条件合并为单条SQL执行,不会产生多次数据库请求,性能和手写组合条件完全一致 - 统一每个字段的无效默认值规则:比如数值类用0、字符串类用空字符串、日期类用
DateTime.MinValue,可以进一步简化判断逻辑 - 如果筛选条件超过10个,还可以把每个筛选条件的判断逻辑封装为独立的扩展方法,代码整洁度会更高
内容的提问来源于stack exchange,提问作者stoo frisat
相关产品推荐
相关产品推荐

