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);
        }
示例#2
0
        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());
        }