新增Appointment日程时如何校验是否与已有日程重叠及修复校验误判问题
修复方案
问题根因
你现有代码的核心问题是时间段重叠的判断逻辑完全错误,同时存在查询过滤逻辑冗余的问题:
- 原有判断条件命中了大量完全不重叠的场景:比如已有日程结束时间早于新日程开始时间的非重叠场景,也会被你的判断条件命中,所以才会出现无重叠也报错的问题
- 你把
Weekday的过滤放在了Any的内部逻辑中,没有提前在数据库查询阶段过滤,会拉取大量无效数据降低查询效率 - 末尾的
? true : false属于冗余写法,Any()方法本身返回的就是布尔值,不需要额外转换
正确的时间段重叠判断逻辑
两个时间段[x_start, x_end]和[new_start, new_end]发生重叠的核心条件是:x的开始时间 < 新日程的结束时间 且 新日程的开始时间 < x的结束时间
注:如果你的业务允许日程首尾相接(比如前一个日程14:00结束,新日程14:00开始不算重叠),则直接用上述条件即可;如果首尾相接也算重叠,将
<替换为<=即可。
修复后的代码
public async Task<IEnumerable<Notification>> ValidateAdd(AppointmentViewModel model) { // 提前在查询层过滤同活动、同周次的日程,减少拉取的数据量 var relatedAppointments = await _appointmentRepo .FindBy(x => x.ActivityId == model.ActivityId && x.Weekday == model.Weekday) .ToListAsync(); // 正确的重叠判断 bool hasOverlap = relatedAppointments.Any(x => x.StartAppointment < model.EndAppointment && model.StartAppointment < x.EndAppointment ); // 后续你自己的报错逻辑,比如hasOverlap为true时添加重叠提示的Notification // ... }
内容的提问来源于stack exchange,提问作者Victor Lima
相关产品推荐
相关产品推荐

