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

仓储层实现基于MinAge与MaxAge的球员年龄范围筛选方案问询

实现基于年龄范围的球员筛选逻辑

要实现年龄范围筛选,核心是把MinAge和MaxAge转换成对应的出生日期UTC日期范围,再将这个条件加入数据库查询中。同时要确保分页统计的总数也包含同样的筛选条件,避免分页数据和总数不匹配。

步骤说明

  1. 计算出生日期阈值
    基于当前UTC时间,推导符合年龄范围的出生日期上下限:

    • 筛选>= MinAge的球员:出生日期需小于等于当前UTC日期减去MinAge年(确保球员至少满MinAge岁)
    • 筛选<= MaxAge的球员:出生日期需大于等于当前UTC日期减去MaxAge+1年再加1天(确保球员年龄不超过MaxAge岁)
      全程使用UTC时间,和数据库存储的DateOfBirth格式保持一致,避免时区偏差。
  2. 修改查询逻辑
    在原有俱乐部ID筛选的基础上,追加年龄筛选条件,且要在排序、分页前应用筛选,保证分页数据是筛选后的结果。同时统计总数的查询也要同步加入筛选条件,确保分页逻辑准确。

修改后的完整代码

public async Task<PagedList<Player>> GetAll(Guid clubId, PlayerParameters playerParameters, bool trackChanges)
{
    // 获取当前UTC日期,避免重复计算
    var nowUtc = DateTime.UtcNow.Date;
    
    // 初始化基础查询(仅筛选俱乐部ID)
    IQueryable<Player> query = FindByCondition(p => p.ClubId.Equals(clubId), trackChanges);
    
    // 添加最小年龄筛选(如果参数存在)
    if (playerParameters.MinAge.HasValue)
    {
        var minAgeBirthDate = nowUtc.AddYears(-playerParameters.MinAge.Value);
        query = query.Where(p => p.DateOfBirth <= minAgeBirthDate);
    }
    
    // 添加最大年龄筛选(如果参数存在)
    if (playerParameters.MaxAge.HasValue)
    {
        var maxAgeBirthDate = nowUtc.AddYears(-(playerParameters.MaxAge.Value + 1)).AddDays(1);
        query = query.Where(p => p.DateOfBirth >= maxAgeBirthDate);
    }
    
    // 执行排序、分页查询
    var players = await query
        .OrderBy(p => p.Name)
        .Skip((playerParameters.PageNumber - 1) * playerParameters.PageSize)
        .Take(playerParameters.PageSize)
        .ToListAsync();
    
    // 统计筛选后的总记录数
    int count = await query.CountAsync();
    
    return new PagedList<Player>(players, count, playerParameters.PageNumber, playerParameters.PageSize);
}

关键细节

  • 空值兼容:通过HasValue判断参数是否传入,支持仅传MinAge或仅传MaxAge的单向筛选场景。
  • 性能优化:用日期范围替代实时计算年龄,避免数据库层面的复杂运算,提升查询效率。
  • 数据一致性:总数统计和分页查询复用同一筛选后的数据集,避免出现分页页码和总数不匹配的问题。

内容的提问来源于stack exchange,提问作者Eduardo Oliveira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:10:39