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)); } }