Beispiel #1
0
        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);
        }
Beispiel #2
0
        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
            });
        }