Esempio n. 1
0
        public async Task OnGetAsync()
        {
            Filter movieFilter = null;

            // Ist gar kein Filter selektiert (erster Aufruf), prüfe auf Defaultfilter und nehme diesen ggf. als Vorauswahl
            //if (SelectedFilterId == null)
            //{
            //    var defaultFilter = FilterService.GetDefault();
            //    if (defaultFilter != null)
            //        SelectedFilterId = defaultFilter.Id;
            //}
            // Gewählten Filter als Default speichern
            if (!string.IsNullOrEmpty(SelectedFilterId))
            {
                await FilterService.SetDefault(SelectedFilterId);

                movieFilter = FilterService.GetDefault();
            }
            // Defaultfilter zurücksetzen bei Auswahl von "Kein Filter"
            else
            {
                await FilterService.ResetDefault();
            }

            // Die Sortierung ist im Gegensatz zum Filter nicht in der Datenbank abgelegt
            // Stattdessen wird sie als SessionState solange vorgehalten, bis das Session-Timeout (default 20 Minuten) abgelaufen ist
            // Um SessionState verwenden zu können, muss dieser aktiviert werden, siehe Startup
            if (MovieSortOrder != MovieSortOrder.None)
            {
                HttpContext.Session.SetInt32("MovieSortOrder", (int)MovieSortOrder);
            }
            else
            {
                var sortOrder = HttpContext.Session.GetInt32("MovieSortOrder");
                if (sortOrder > 0)
                {
                    MovieSortOrder = (MovieSortOrder)Enum.Parse(typeof(MovieSortOrder), sortOrder.ToString());
                }
            }

            var movies = await MovieService.GetWithGenresAndSourcesAsync(MovieSortOrder);

            if (!string.IsNullOrEmpty(QuickSearch))
            {
                Movies = new List <MoviesItemViewModel>(movies.Where(m => m.Title.Contains(QuickSearch)).Select(m => new MoviesItemViewModel(m)));
            }
            else
            {
                Movies = new List <MoviesItemViewModel>(movies.Select(m => new MoviesItemViewModel(m)));
            }

            if (movieFilter != null)
            {
                Movies = Movies.AsQueryable().Where(FilterBuilder.FilterBuilder <MoviesItemViewModel> .Ref.BuildFilter(movieFilter)).ToList();
            }

            FilterList = new SelectList(await FilterService.GetAsync(), nameof(Filter.Id), nameof(Filter.Name));
        }
Esempio n. 2
0
        public async Task <IList <Movie> > GetWithGenresAndSourcesAsync(MovieSortOrder sortOrder)
        {
            using (var context = new MoviekusDbContext())
            {
                var movies = await context.Movies.Include(s => s.Source).ToListAsync();

                foreach (var movie in movies)
                {
                    // Dieser Aufruf führt dazu, dass die bereits geladenen Movie-Objekte mit den MovieGenres angereichert werden
                    // Ein manuelles Add ist nicht erforderlich!
                    var movieGenres = context.MovieGenres.Where(mg => mg.Movie == movie).Include(g => g.Genre).ToList();
                }

                switch (sortOrder)
                {
                case MovieSortOrder.Title:
                    return(movies.OrderBy(m => m.Title).ToList());

                case MovieSortOrder.LastSeen:
                    return(movies.OrderBy(m => m.LastSeen).ToList());

                case MovieSortOrder.Rating:
                    return(movies.OrderByDescending(m => m.Rating).ToList());

                case MovieSortOrder.ReleaseDate:
                    return(movies.OrderByDescending(m => m.ReleaseDate).ToList());

                case MovieSortOrder.Runtime:
                    return(movies.OrderBy(m => m.Runtime).ToList());

                case MovieSortOrder.EpisodeNumber:
                    return(movies.OrderBy(m => m.EpisodeNumber).ToList());

                default: return(movies);
                }
            }

            /*
             * Diese Variante funktioniert nur bei kleinen Datenmengen. Danach kommt es zu folgendem, nicht näher erklärbarem Fehler:
             * SQLite Error 1: 'SQL logic error'
             * using (var context = new MoviekusDbContext())
             * {
             *  switch(sortOrder)
             *  {
             *      case MovieSortOrder.Title:
             *          return await context.Movies.OrderBy(m => m.Title).Include(s => s.Source).Include(m => m.MovieGenres).ThenInclude(g => g.Genre).ToListAsync();
             *      case MovieSortOrder.LastSeen:
             *          return await context.Movies.OrderBy(m => m.LastSeen).Include(s => s.Source).Include(m => m.MovieGenres).ThenInclude(g => g.Genre).ToListAsync();
             *      case MovieSortOrder.Rating:
             *          return await context.Movies.OrderBy(m => m.Rating).Include(s => s.Source).Include(m => m.MovieGenres).ThenInclude(g => g.Genre).ToListAsync();
             *      case MovieSortOrder.ReleaseDate:
             *          return await context.Movies.OrderBy(m => m.ReleaseDate).Include(s => s.Source).Include(m => m.MovieGenres).ThenInclude(g => g.Genre).ToListAsync();
             *      case MovieSortOrder.Runtime:
             *          return await context.Movies.OrderBy(m => m.Runtime).Include(s => s.Source).Include(m => m.MovieGenres).ThenInclude(g => g.Genre).ToListAsync();
             *      default:
             *          return await context.Movies
             *              .Include(s => s.Source)
             *              .Include(m => m.MovieGenres)
             *              .ThenInclude(g => g.Genre)
             *              .ToListAsync();
             *  }
             * }
             */
        }