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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:57:34