如何在C#应用中实现人员列表的三类退休状态筛选功能?
解决方案:使用可空布尔类型替代普通布尔类型
用bool?(可空布尔)替代DTO中的bool Retired,天然支持三种查询状态,无需额外新增ShowAll参数,从根源避免参数混淆问题:
1. 修改DTO
将Retired字段改为可空类型,同时设置默认值满足「默认查询非退休人员」的需求:
public class PeopleDto { public string Name { get; set; } // 可空布尔语义:null=查询全部,false=在职,true=退休 // 默认值设为false,实现默认查询非退休人员 public bool? Retired { get; set; } = false; }
2. 更新查询扩展方法
修改扩展方法,处理可空参数的三种分支逻辑:
public static class QueryableExtensions { public static IQueryable<T> FilterByRetiredStatus<T>(this IQueryable<T> query, bool? retiredStatus) where T : People { // 参数为null时,不添加退休状态过滤(查询全部) if (retiredStatus == null) return query; // 参数有值时,按指定状态过滤 return query.Where(people => people.Retired == retiredStatus.Value); } }
(注:方法名改为FilterByRetiredStatus更贴合语义,也可保留原方法名,核心是处理null的逻辑)
3. 调整Service查询逻辑
替换原扩展方法调用,同时复用基础查询逻辑避免代码重复:
public PaginatedResult<People> GetAll(PeopleDto peopleDto) { // 构建复用的基础查询 var baseQuery = _dbContext.People .Where(people => string.IsNullOrEmpty(peopleDto.Name) || people.Name.Contains(peopleDto.Name)) .FilterByRetiredStatus(peopleDto.Retired); var peopleList = baseQuery .OrderBy(people => people.Id) .ToList(); int totalItems = baseQuery.Count(); return new PaginatedResult<People> { Items = peopleList, TotalCount = totalItems, }; }
4. 前端参数对应规则
页面三个功能按钮对应传递的参数:
- 在职:
Retired=false - 退休:
Retired=true - 全部:
Retired=null
若需要区分「前端未传参」和「前端主动传null」,可在Service中补充逻辑:
// 未传参时默认查在职,主动传null时查全部 var actualStatus = peopleDto.Retired.HasValue ? peopleDto.Retired : false;
内容的提问来源于stack exchange,提问作者Feel free
相关产品推荐
相关产品推荐

