public IEnumerable <FreeHotelRoomDTO> SearchFreeRooms(HotelRoomSeachFilterDTO filter) { if (filter is null) { throw new ArgumentNullException("filter"); } TypeComfortEnum comfort = Mapper.Map <TypeComfortEnum>(filter.TypeComfort); TypeSizeEnum size = Mapper.Map <TypeSizeEnum>(filter.TypeSize); var rooms = UnitOfWork.HotelRooms.FindFreeRooms(filter.CheckInDate, size, comfort); List <FreeHotelRoomDTO> result = new List <FreeHotelRoomDTO>(); if (!rooms.Any()) // rooms.Count() не гуд, потому что будет перебирать всю колекцию { return(result); } foreach (var room in rooms) // search for a period of time the room is free { DateTime?minDate = null; foreach (var date in room.ActiveOrders) { if (date.ChecknInDate > filter.CheckInDate && (minDate is null || minDate > date.ChecknInDate)) { minDate = date.ChecknInDate; } } var temp = Mapper.Map <HotelRoom, FreeHotelRoomDTO>(room); temp.CheckInDate = filter.CheckInDate; temp.MaxCheckOutDate = minDate; result.Add(temp); } return(result); }
private IEnumerable <HotelRoom> FreeRoomsFilter(HotelRoomSeachFilterDTO filter) { TypeComfortEnum comfort = Mapper.Map <TypeComfortEnum>(filter.TypeComfort); TypeSizeEnum size = Mapper.Map <TypeSizeEnum>(filter.TypeSize); IQueryable <HotelRoom> rooms = UnitOfWork.HotelRooms.GetQuery().Include(p => p.TypeComfort).Include(p => p.TypeSize).Include(p => p.ActiveOrders); if (filter.HotelId != 0) { rooms = rooms.Where(p => p.HotelId == filter.HotelId); } if (size != 0) { rooms = rooms.Where(p => p.TypeSize.Size == size); } if (comfort != 0) { rooms = rooms.Where(p => p.TypeComfort.Comfort == comfort); } if (filter.CheckOutDate is null) { rooms = rooms.Where(p => p.ActiveOrders.All(t => t.CheckInDate > filter.CheckInDate || t.CheckOutDate <= filter.CheckInDate)); } else { rooms = rooms.Where(p => p.ActiveOrders.All(t => (filter.CheckInDate > t.CheckInDate && filter.CheckInDate >= t.CheckOutDate) || (filter.CheckOutDate <= t.CheckInDate && filter.CheckOutDate < t.CheckOutDate))); } return(rooms.AsNoTracking().ToList()); }
public IEnumerable <HotelRoom> FindFreeRooms(DateTime checkInDate, TypeSizeEnum size = 0, TypeComfortEnum comfort = 0) { IQueryable <HotelRoom> rooms = context.HotelRooms.Include(p => p.TypeComfort).Include(p => p.TypeSize).Include(p => p.ActiveOrders); if (size != 0) { rooms = rooms.Where(p => p.TypeSize.Size == size); } if (comfort != 0) { rooms = rooms.Where(p => p.TypeComfort.Comfort == comfort); } return(rooms.Where(p => p.ActiveOrders.All(t => t.ChecknInDate > checkInDate || t.CheckOutDate <= checkInDate)).AsNoTracking().ToList()); // поиск по промежутку времени //Where(p => p.ActiveOrders(p => p.ActiveOrders.All(t => (checkInDate > t.checkInDate && checkInDate >= t.checkOutDate) || (checkOutDate <= t.checkInDate && checkOutDate < t.checkOutDate)))); }
public IEnumerable <HotelRoom> FindFreeRooms(TypeSizeEnum size, TypeComfortEnum comfort, DateTime checkInDate, DateTime?checkOutDate = null) { IQueryable <HotelRoom> rooms = context.HotelRooms.Include(p => p.TypeComfort).Include(p => p.TypeSize).Include(p => p.ActiveOrders); if (size != 0) { rooms = rooms.Where(p => p.TypeSize.Size == size); } if (comfort != 0) { rooms = rooms.Where(p => p.TypeComfort.Comfort == comfort); } if (checkOutDate is null) { rooms = rooms.Where(p => p.ActiveOrders.All(t => t.CheckInDate > checkInDate || t.CheckOutDate <= checkInDate)); } else { rooms = rooms.Where(p => p.ActiveOrders.All(t => (checkInDate > t.CheckInDate && checkInDate >= t.CheckOutDate) || (checkOutDate <= t.CheckInDate && checkOutDate < t.CheckOutDate))); } return(rooms.AsNoTracking().ToList()); }