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

.NET6 SwaggerUI查询字符串空数组参数问题:日期范围查询异常

日期范围查询Swagger参数问题及解决

问题场景

在GET请求中实现日期范围查询,目前"after"(大于指定日期)和"Between"(介于两个日期之间)功能正常,但要实现"before"(小于指定日期)功能时,SwaggerUI不允许将Birthday数组的任一值留空,导致无法单独传入"before"参数。

现有代码

控制器

[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(List<Patient>))]
public async Task<IActionResult> Read([FromQuery] GetPatientsQuery parameters)
{
    var result = await _mediator.Dispatch(parameters);
    return Ok(result);
}

参数对象(GetPatientsQuery继承自此)

public class GetPatientsParameters
{
    public string? FirstName { get; set; }
    public string? LastName { get; set; }
    public DateTime?[]? Birthday { get; set; } // 用于范围查询
    public string? Gender { get; set; }
}

Linq To Entity查询

return await _context.Set<Patient>()
                .Where(x => query.FirstName == null || x.FirstName.ToLower().StartsWith(query.FirstName.ToLower()))
                .Where(x => query.LastName == null || x.LastName.ToLower().StartsWith(query.LastName.ToLower()))

                // 生日范围查询逻辑
                .Where(x => query.Birthday == null || x.Birthday > (query.Birthday.ElementAtOrDefault(0) ?? DateTime.MinValue))
                .Where(x => query.Birthday == null || x.Birthday < (query.Birthday.ElementAtOrDefault(1) ?? DateTime.MaxValue))

                .Where(x => query.Gender == null || x.Gender.ToLower() == query.Gender.ToLower())

                .ToListAsync();

SwaggerUI问题截图

SwaggerUI要求必填可空日期值

解决方案

放弃用数组承载日期范围参数,改为两个独立的可空DateTime参数。这样既能单独传"before"或"after",也能同时传两者实现范围查询,且SwaggerUI会正确识别为可选参数:

修改后的参数对象

public class GetPatientsParameters
{
    public string? FirstName { get; set; }
    public string? LastName { get; set; }
    public DateTime? BirthdayAfter { get; set; } // 生日大于此值
    public DateTime? BirthdayBefore { get; set; } // 生日小于此值
    public string? Gender { get; set; }
}

修改后的Linq查询

return await _context.Set<Patient>()
                .Where(x => query.FirstName == null || x.FirstName.ToLower().StartsWith(query.FirstName.ToLower()))
                .Where(x => query.LastName == null || x.LastName.ToLower().StartsWith(query.LastName.ToLower()))
                .Where(x => query.BirthdayAfter == null || x.Birthday > query.BirthdayAfter)
                .Where(x => query.BirthdayBefore == null || x.Birthday < query.BirthdayBefore)
                .Where(x => query.Gender == null || x.Gender.ToLower() == query.Gender.ToLower())
                .ToListAsync();

修改后效果:

  • 单独传BirthdayBefore即可实现"before"查询
  • 单独传BirthdayAfter即可实现"after"查询
  • 同时传两个参数即可实现"Between"范围查询
  • SwaggerUI不会强制要求填写这两个参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:55:25