public async Task <Dto.Common.Page <Movie> > GetMoviesAsync(MoviesQueryFilter queryFilter) { var orderByFilters = _orderByFilterParser.Parse <Movie>(queryFilter?.Orderby) ?? new[] { nameof(Movie.Date) }; var pagingFilter = new MoviesPagingFilter { OrderBy = orderByFilters, Page = queryFilter?.Page, Size = queryFilter?.Size, SearchQuery = queryFilter?.Search, Studios = queryFilter?.Studios, Categories = queryFilter?.Categories, Models = queryFilter?.Models, Date = queryFilter?.Date }; var page = await _movies.FindMoviesAsync(pagingFilter); var result = new Dto.Common.Page <Movie> { Data = _mapper.Map <IEnumerable <Movie> >(page.Data), Size = page.Size, Offset = page.Offset, Total = page.Total }; return(result); }
public async Task <Page <Movie> > FindMoviesAsync(MoviesPagingFilter pagingFilter) { var watch = Stopwatch.StartNew(); IQueryable <Binding.Models.Movie> movies = null; if (pagingFilter.Models?.Length >= 1) { var lowerModelsNames = pagingFilter.Models.Select(e => e.ToLower()).ToArray(); var ids = await Context.Set <Binding.Models.Model>().Where(e => lowerModelsNames.Contains(e.Name.ToLower())).Select(e => e.ModelId).ToListAsync(); var idsLength = ids.Count; if (idsLength == 0) { return(new Page <Movie>()); } movies = Context.Set <Binding.Models.Movie>() .Where(e => e.MovieModels.Count(x => ids.Contains(x.ModelId)) == idsLength); } if (pagingFilter.Categories?.Length >= 1) { var lowerCategoriesNames = pagingFilter.Categories.Select(e => e.ToLower()).ToArray(); var ids = await Context.Set <Binding.Models.Category>().Where(e => lowerCategoriesNames.Contains(e.Name.ToLower())).Select(e => e.CategoryId).ToListAsync(); var idsLength = ids.Count; if (idsLength == 0) { return(new Page <Movie>()); } movies = (movies ?? Context.Set <Binding.Models.Movie>()) .Where(e => e.MovieCategories.Count(x => ids.Contains(x.CategoryId)) == idsLength); } if (pagingFilter.Studios?.Length >= 1) { movies = (movies ?? Context.Set <Binding.Models.Movie>()) .Where(e => pagingFilter.Studios.Contains(e.StudioId)); } if (movies == null) { movies = Context.Set <Binding.Models.Movie>(); } if (pagingFilter.Date.HasValue) { movies = movies .Where(e => e.Date == pagingFilter.Date); } movies = movies .Include(e => e.Attachments) .Include(e => e.Studio); var page = await GetPageAsync(movies, pagingFilter.OrderBy, pagingFilter.Page, pagingFilter.Size); watch.Stop(); var seconds = watch.Elapsed.Seconds; return(new Page <Movie> { Size = page.Size, Data = _mapper.Map <IEnumerable <Movie> >(page.Data), Offset = page.Offset, Total = page.Total }); }