我有一个预订web应用程序,预订存储从日期到日期。
当有新的预订时,我需要检查日期和日期的预订是否在日期和日期的任何预订范围内。
假设我预订了:
A,日期:10/10/2021A至日期:2021年10月15日
如果我尝试用:
进行新的预订A,日期:202021年10月9日截止日期:2021年10月16日
那么应该返回false
或者如果我尝试用:
进行新的预订A,日期:10/10/2021A至2021年10月11日止
那么它应该返回false
到目前为止,这是我所拥有的:
var bookings = _bookingRepository.GetAll().Where(oldBooking => newBookingfrom >= oldBooking.From && newBookingTo <= oldBooking.To);
但这并不像预期的那样工作,当我第一次接触它时,这似乎很容易,但它让我感到困惑。
供参考:GetAll()方法返回的所有预订从DB。
要检查一个区间是否与另一个区间重叠,您需要将一个端点与另一个起点进行比较,反之亦然。
var bookings = _bookingRepository.GetAll()
.Where(oldBooking =>
newBookingfrom < oldBooking.To &&
newBookingTo > oldBooking.From );
要得到不重叠的结果,只需在整个条件上加上!(
。
请注意,根据是否涉及时间组件,您可能需要将条件更改为>=
。
我建议使用这个查询,如果时间范围不重叠,它将返回true
,否则它将返回false
。
var bookings = _bookingRepository.GetAll()
.Where(oldBooking =>
newBookingfrom > oldBooking.To ||
newBookingTo < oldBooking.From );
在这里,我假设你已经检查了newBookingfrom
总是在newBookingTo
之前,并且日期范围是数据库也是正确的范围。