public async Task <PageModel <HotelModel> > GetHotelPage(FilteredHotelsRequestModel request, bool availableOnly = true)
        {
            var reservationList = _dataContext.RoomReservations as IQueryable <RoomReservation>;
            int size            = request.PageSize ?? _pageSize;

            if (size > _maxPageSize)
            {
                size = _pageSize;
            }

            var entityList   = _dataContext.Hotels as IQueryable <Hotel>;
            var reservations = _dataContext.RoomReservations;

            var resultQuery = entityList
                              .FilterHotels(request, _maxElapsedMinutes, _dataContext, availableOnly)
                              .OrderByDescending(h => reservations.Where(r => r.HotelRoom.HotelId == h.HotelId).Count())
                              .Include(h => h.Services)
                              .Include(h => h.Location)
                              .ThenInclude(l => l.City)
                              .ThenInclude(c => c.Country)
                              .Include(h => h.Images);

            int resultCount = await resultQuery.CountAsync();

            int currentPage = (request.Page > 0) ? request.Page : 1;

            var listForPage = resultQuery
                              .CutList(size, currentPage)
                              .Select(hotel => new HotelModel(hotel));

            return(new PageModel <HotelModel>(currentPage, size, resultCount, listForPage));
        }
        public static IQueryable <Hotel> FilterHotels(this IQueryable <Hotel> hotels,
                                                      FilteredHotelsRequestModel filters, int maxElapsedMinutes, HotelDbContext dataContext,
                                                      bool availableOnly = true)
        {
            if (filters == null)
            {
                return(hotels);
            }

            if (filters.HotelId != null)
            {
                return(hotels.FilterById(filters.HotelId));
            }

            var filteredList = hotels.FilterByAvailability(availableOnly)
                               .FilterByName(filters.Name)
                               .FilterByLocation(filters.CountryId, filters.CityId);

            var roomList = dataContext.HotelRooms;

            var filteredRoomList = roomList
                                   .FilterByAdultAmount(filters.Adults)
                                   .FilterByDateAvailability(filters.MoveInDate, filters.MoveOutDate, maxElapsedMinutes, dataContext);

            filteredList = from hr in filteredRoomList
                           join h in filteredList on hr.HotelId equals h.HotelId into result
                           from h in result
                           select h;

            return(filteredList.Distinct());
        }
        public async Task <IActionResult> GetHotelList([FromQuery] FilteredHotelsRequestModel requestModel)
        {
            try
            {
                var page = await _hotelService.GetHotelPage(requestModel);

                return(Ok(page));
            }
            catch (Exception e)
            {
                _logger.LogInformation(e.Message, e.StackTrace);
                return(StatusCode(StatusCodes.Status500InternalServerError));
            }
        }