.NET Core API如何根据起止DateTime筛选可用Venue场地
核心判定逻辑
两个时间段存在预约冲突的充要条件为:已有预约的开始时间 < 用户请求的结束时间 且 已有预约的结束时间 > 用户请求的开始时间,只要满足该条件,说明对应场地在用户选定的时间段内已被占用,需要排除。
实现代码
假设你的数据库上下文实例为_context,包含Venues(场地表)和VenueReservations(预约记录表)两个数据集,参考代码如下:
// 1. 基础入参校验 if (userInputEndTime <= userInputStartTime) { // 此处返回参数错误响应,示例:return BadRequest("结束时间必须晚于开始时间"); } // 2. 核心查询语句(EF Core 直接查询数据库场景) var availableVenues = await _context.Venues .Where(venue => !_context.VenueReservations .Any(reservation => reservation.VenueId == venue.Id && reservation.StartDateTime < userInputEndTime && reservation.EndDateTime > userInputStartTime )) .ToListAsync();
如果是内存数据筛选场景,只需要将_context.VenueReservations替换为内存中的预约列表即可。
注意事项
- 时间时区统一:建议所有时间统一使用UTC时间存储和传参,避免时区偏移导致的判断错误。
- 额外业务过滤:如果你的预约存在已取消、已过期等无效状态,可以在
Any方法的判断条件中追加状态过滤规则,比如追加&& reservation.IsValid == true。 - 性能优化:数据量较大时,可给
VenueReservations表的VenueId、StartDateTime、EndDateTime字段添加联合索引,提升查询效率。
内容的提问来源于stack exchange,提问作者Jan-Derk de Vries
相关产品推荐
相关产品推荐

