示例#1
0
        public List <MovieResult> SearchTopMoviesByUserRating(int userId)
        {
            var moviesIds = moviesRepository.GetUserRatings().Where(ur => ur.UserId == userId)
                            .OrderByDescending(ur => ur.Rating).ThenBy(ur => ur.Movie.Title).Take(5).Select(ur => ur.MovieId).ToArray();

            var movies = moviesRepository.GetUserRatings().Where(ur => moviesIds.Contains(ur.MovieId))
                         .GroupBy(ur => new { ur.MovieId, ur.Movie.Title, ur.Movie.ReleaseYear, ur.Movie.RunningTime })
                         .Select(g => new MovieResult()
            {
                Id            = g.Key.MovieId,
                Title         = g.Key.Title,
                ReleaseYear   = g.Key.ReleaseYear,
                RunningTime   = g.Key.RunningTime,
                AverageRating = g.Average(x => x.Rating)
            }).ToList();

            movies = movies.OrderBy(m => Array.IndexOf(moviesIds, m.Id)).ToList();

            foreach (var movie in movies)
            {
                movie.AverageRating = RoundingUtils.RoundToNearestDot5(movie.AverageRating);
            }

            return(movies);
        }
示例#2
0
        public List <MovieResult> SearchMoviesByFilter(MovieFilter filter)
        {
            if (string.IsNullOrEmpty(filter.Title) && filter.ReleaseYear.HasValue == false && filter.Genres.Any() == false)
            {
                throw new InvalidInputException();
            }
            var moviesQuery = moviesRepository.GetMovies();

            if (string.IsNullOrEmpty(filter.Title) == false)
            {
                moviesQuery = moviesQuery.Where(m => m.Title.StartsWith(filter.Title));
            }

            if (filter.ReleaseYear.HasValue)
            {
                moviesQuery = moviesQuery.Where(m => m.ReleaseYear == filter.ReleaseYear);
            }

            if (filter.Genres.Any())
            {
                var aggregatedValue = filter.Genres.Aggregate((aggr, next) => next | aggr);
                moviesQuery = moviesQuery.Where(m => (m.Genre & aggregatedValue) == aggregatedValue);
            }


            var movies = moviesQuery.Select(m => new MovieResult()
            {
                Id            = m.Id,
                Title         = m.Title,
                ReleaseYear   = m.ReleaseYear,
                RunningTime   = m.RunningTime,
                AverageRating = (int)m.Genre
            }).ToList();

            var moviesIds     = movies.Select(m => m.Id).ToArray();
            var moviesRatings = moviesRepository.GetUserRatings().Where(ur => moviesIds.Contains(ur.MovieId)).GroupBy(ur => ur.MovieId)
                                .Select(g => new
            {
                MovieId       = g.Key,
                AverageRating = g.Average(x => x.Rating)
            }).ToList();

            foreach (var movie in movies)
            {
                movie.AverageRating = RoundingUtils.RoundToNearestDot5(moviesRatings.SingleOrDefault(r => r.MovieId == movie.Id)?.AverageRating);
            }

            return(movies);
        }
示例#3
0
        public List <MovieResult> SearchTopMoviesByTotalAverageRating()
        {
            var movies = moviesRepository.GetUserRatings().GroupBy(ur => new { ur.MovieId, ur.Movie.Title, ur.Movie.ReleaseYear, ur.Movie.RunningTime })
                         .Select(g => new MovieResult()
            {
                Id            = g.Key.MovieId,
                Title         = g.Key.Title,
                ReleaseYear   = g.Key.ReleaseYear,
                RunningTime   = g.Key.RunningTime,
                AverageRating = g.Average(x => x.Rating)
            })
                         .OrderByDescending(m => m.AverageRating).ThenBy(m => m.Title).Take(5).ToList();

            foreach (var movie in movies)
            {
                movie.AverageRating = RoundingUtils.RoundToNearestDot5(movie.AverageRating);
            }

            return(movies);
        }