using System; using System.Collections.Generic; using System.Text; using GoMovies2020.Shared.Models; using GoMovies2020.Shared.ViewModels; using GoMovies2020.Shared.Enums; using System.Linq; namespace GoMovies2020.Shared.Queryables { public static class FilmFilterQueries { public static IQueryable ApplyQueryFilter(IQueryable films, FilmsFilterViewModel filmsFilter) { // Check if a FilterField has been specified (i.e. not set to No Filter - Show All) // Check if a FilterSearchString, i.e. something to search for, has been specified if (filmsFilter.FilterField != FilmFilterColumns.NoFilter && !string.IsNullOrEmpty(filmsFilter.FilterSearchString)) { // What filter field has been selected by the user? switch (filmsFilter.FilterField) { case FilmFilterColumns.ByTitle: // Search the title return films.Where(f => f.Title.Contains(filmsFilter.FilterSearchString)); case FilmFilterColumns.ByGenre: // Search the genre return films.Where(f => f.Genre.Contains(filmsFilter.FilterSearchString)); case FilmFilterColumns.ByCast: // Search the cast return films.Where(f => f.Cast.Contains(filmsFilter.FilterSearchString)); case FilmFilterColumns.ByTitleGenreCast: // Search the title, genre, or cast return films.Where(f => f.Title.Contains(filmsFilter.FilterSearchString) || f.Genre.Contains(filmsFilter.FilterSearchString) || f.Cast.Contains(filmsFilter.FilterSearchString)); case FilmFilterColumns.ByReviewRating: // Search the review rating decimal reviewRatingFilter = 0; decimal.TryParse(filmsFilter.FilterSearchString, out reviewRatingFilter); return films.Where(f => f.ReviewRating >= reviewRatingFilter); case FilmFilterColumns.ByReleaseYear: // Search the release year int releaseYear = 0; int.TryParse(filmsFilter.FilterSearchString, out releaseYear); if (releaseYear > 0) { return films.Where(f => f.CinemaReleaseDate.Year == releaseYear); } return films; // TODO: complete the rest (Cast, Review Rating, Release Year) } } return films; } public static IQueryable ApplyQuerySort(IQueryable films, FilmsFilterViewModel filmsFilter) { // What column to sort the results by has been select by the user? switch (filmsFilter.SortBy) { case FilmSortOptions.ByTitle: // Sort by Title ASC return films.OrderBy(f => f.Title); case FilmSortOptions.ByReleaseDate: // Sort by Cinema Release Date ASC return films.OrderBy(f => f.CinemaReleaseDate); case FilmSortOptions.ByReleaseDateDesc: // Sort by Cinema Release Date DESC return films.OrderByDescending(f => f.CinemaReleaseDate); case FilmSortOptions.ByReviewRating: // Sort by Review Rating ASC return films.OrderBy(f => f.ReviewRating); case FilmSortOptions.ByReviewRatingDesc: // Sort by Review Rating DESC return films.OrderByDescending(f => f.ReviewRating); // TODO: complete the rest (Release Date DESC, Review Rating, Review Rating DESC) } return films; } public static IQueryable ApplyQueryFetchRange(IQueryable films, FilmsFilterViewModel filmsFilter) { return films.Skip(filmsFilter.SkipCount).Take(filmsFilter.PageSize); } } }