.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问题截图

解决方案
放弃用数组承载日期范围参数,改为两个独立的可空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
相关产品推荐
相关产品推荐

