我正在使用Visual Studio 2013社区为我的编码课程开展一个非常简单的酒店预订项目,用户可以将客户预订到一个房间,如果该房间已在该日期预订,则该程序应该停止用户或它们与其他预订在某种程度上重叠。
我面临的问题是,如果用户进行了新的预订,其中登记入住和退房日期与其他2个预订退房日期相同,则可能与其他预订重叠。
例:
预订A - 01.01.15至02.01.15
预订B - 03.01.15至04.01.15
预订C - 05.01.15至06.01.15
预订D - 02.01.15至06.01.15
在预订D中,用户将02.01.15作为“登记入住”,将06.01.15作为“结账”,由于某种原因,程序无法捕获并允许通过B和C进行预订。
public override void Add(Booking booking)
{
// Don't allow a new booking if the room is already out.
var currentBooking = _ctx.Bookings
.Where(b => b.RoomId == booking.RoomId)
.Select(b => (booking.CheckOut > b.CheckIn && booking.CheckIn < b.CheckOut)
|| (booking.CheckIn < b.CheckIn && booking.CheckOut > b.CheckIn))
.FirstOrDefault();
if (currentBooking)
{
throw new BookingException("The Room is already out on that date.");
}
_ctx.Set<Booking>().Add(booking);
_ctx.SaveChanges();
}
我原本以为通过检查新的Check In和Check Out是否与之前的Check Out(见下文)相同,我会解决问题但是这个逻辑肯定有问题。
.Select(b => (booking.CheckOut > b.CheckIn && booking.CheckIn < b.CheckOut)
|| (booking.CheckIn < b.CheckIn && booking.CheckOut > b.CheckIn)
|| (booking.CheckIn == b.CheckOut && booking.CheckOut == b.CheckOut))
我是否应该做一些事情,比如检查新的登记和退房是否与之前退房的1天相同?
答案 0 :(得分:1)
我认为您需要一些代码来检查特定日期是否介于2个日期之间(我不知道您的情况是否正确)
> public int CheckDateBetween2Dates(DateTime Date)
> {
> try
> {
> if (Date.Ticks >StartingDate.Ticks && Date.Ticks < EndDate.Ticks)
> {
> //..The Date is between the 2 dates return 1;
> }
> else
> {
> //..The Date is not between them return 0;
> }
> }
> catch
> {
> return -1;
> }
>
> }
答案 1 :(得分:1)
如果第一个句点的开始位于第二个句点的开始和结束之间,或者如果第二个句点的开始位于第一个句点的开始和结束之间,那么两个句点重叠,那么您可以写:
public override void Add(Booking booking)
{
// Don't allow a new booking if the room is already out.
var currentBooking = _ctx.Bookings
.Where(b => b.RoomId == booking.RoomId &&
(booking.CheckIn <= b.CheckOut && booking.CheckIn >= b.CheckIn ||
b.CheckIn <= booking.CheckOut && b.CheckIn >= booking.CheckIn))
.FirstOrDefault();
if (currentBooking != null)
{
throw new BookingException("The Room is already out on that date.");
}
_ctx.Set<Booking>().Add(booking);
_ctx.SaveChanges();
}
但是,如果某个预订在检查
之后的另一个线程中保存到db,则此方法可能无法正常工作if(currentBooking)
执行。
您可以在表上创建触发器来检查数据库中的约束以避免这种情况。
答案 2 :(得分:0)
这样可以避免重叠
(!(booking.start < b.CheckOut && b.CheckIn < booking.CheckOut))