You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:33:27