ASP.NET Core Web API:如何按CreatedDate起止日期筛选预订记录
实现按CreatedDate筛选预订记录的方案
1. 定义筛选与分页参数类
先创建一个用于接收API查询参数的类,包含日期筛选和分页所需字段:
public class BookingFilterParameters { public DateTime? StartDate { get; set; } public DateTime? EndDate { get; set; } public int PageNumber { get; set; } = 1; public int PageSize { get; set; } = 10; }
用可空DateTime?类型,前端不传值时参数会自动为null,方便后续判断是否启用筛选逻辑。
2. 改造BookingService的查询方法
在服务层中,针对CreatedDate做条件式筛选:只有当StartDate或EndDate有值时,才添加对应的过滤条件,否则直接返回全部数据,同时结合分页逻辑:
public async Task<PageResult<GetBookingResponseDto>> GetBookingsAsync(BookingFilterParameters parameters) { // 初始查询:获取所有Booking的可查询集合 var query = _bookingRepository.GetAllAsQueryable(); // 应用开始日期筛选 if (parameters.StartDate.HasValue) { query = query.Where(b => b.CreatedDate >= parameters.StartDate.Value); } // 应用结束日期筛选 if (parameters.EndDate.HasValue) { // 若需包含EndDate当天的所有记录,可改为:b.CreatedDate <= parameters.EndDate.Value.AddDays(1).AddTicks(-1) query = query.Where(b => b.CreatedDate <= parameters.EndDate.Value); } // 计算总记录数 var totalCount = await query.CountAsync(); // 分页查询并映射为DTO var bookings = await query .Skip((parameters.PageNumber - 1) * parameters.PageSize) .Take(parameters.PageSize) .Select(b => new GetBookingResponseDto { Id = b.Id, CustomerName = b.CustomerName, CreatedDate = b.CreatedDate, // 映射其他业务字段 }) .ToListAsync(); // 封装分页结果 return new PageResult<GetBookingResponseDto> { Items = bookings, TotalCount = totalCount, PageNumber = parameters.PageNumber, PageSize = parameters.PageSize }; }
注意:_bookingRepository.GetAllAsQueryable()需返回IQueryable<Booking>类型,这样EF会将筛选条件转换为SQL语句执行,避免在内存中过滤全量数据。
3. 编写API控制器端点
在Web API控制器中添加接收参数的GET方法:
[ApiController] [Route("api/bookings")] public class BookingsController : ControllerBase { private readonly IBookingService _bookingService; public BookingsController(IBookingService bookingService) { _bookingService = bookingService; } [HttpGet] public async Task<ActionResult<PageResult<GetBookingResponseDto>>> GetBookings([FromQuery] BookingFilterParameters parameters) { var result = await _bookingService.GetBookingsAsync(parameters); return Ok(result); } }
前端可通过以下方式调用:
- 不选日期(默认返回全部):
GET /api/bookings - 仅传开始日期:
GET /api/bookings?StartDate=2024-01-01 - 传起止日期:
GET /api/bookings?StartDate=2024-01-01&EndDate=2024-01-31 - 结合分页:
GET /api/bookings?StartDate=2024-01-01&PageNumber=2&PageSize=15
4. 基础类参考结构
如果你的基础类还未完善,以下是示例结构:
// Booking模型 public class Booking { public int Id { get; set; } public string CustomerName { get; set; } public DateTime CreatedDate { get; set; } // 其他业务字段 } // GetBookingResponseDto public class GetBookingResponseDto { public int Id { get; set; } public string CustomerName { get; set; } public DateTime CreatedDate { get; set; } // 其他需要返回的字段 } // PageResult分页类 public class PageResult<T> { public List<T> Items { get; set; } public int TotalCount { get; set; } public int PageNumber { get; set; } public int PageSize { get; set; } }
内容的提问来源于stack exchange,提问作者Ayobamilaye
相关产品推荐
相关产品推荐

