/// <summary> /// Ermittelt die Liste der Genres für den Movie und fügt diejenigen hinzu, deren Name noch nicht in der /// übergebenen Liste enthalten ist /// Es werden keine Genres entfernt /// Typische Anwednung: Bei Selektion eines Movie von einem Provider werden Genrenamen mitgeliefert, die /// dann dem Film hinzugefügt werden sollen /// </summary> /// <param name="movie">Film, dessen Genres erweitert werden sollem</param> /// <param name="genreNames">Namen der hinzuzufügenden Genres</param> /// <returns>Alle MovieGenres für den Film, also alte sowie neu hinzugefügte</returns> public async Task <ICollection <MovieGenre> > AddMovieGenres(Movie movie, IList <string> genreNames) { List <MovieGenre> movieGenres = new List <MovieGenre>(); IGenreService genreService = Resolver.Resolve <IGenreService>(); // Bestimmen der Genres, die dem Film neu zugeordnet werden müssen var existingGenres = movie.MovieGenres.Where(x => x.Movie == movie).Select(mg => mg.Genre); var existingGenreNames = existingGenres.Select(s => s.Name); var newGenreNames = (from genre in genreNames select genre).Except(from existingGenre in existingGenreNames select existingGenre); foreach (string genreName in newGenreNames) { // Genres anlegen, falls es noch nicht existiert Genre genre = await genreService.GetOrCreateGenre(genreName); MovieGenre movieGenre = MovieGenre.CreateNew <MovieGenre>(); movieGenre.Movie = movie; movieGenre.Genre = genre; movieGenres.Add(movieGenre); } // Auch die bereits vorhandenen, zugeordneten Genres zurückgeben, damit diese angezeigt werden movieGenres.AddRange(movie.MovieGenres); return(movieGenres); }
private void GenreSelectionChangedHandler(GenreSelection genreSelection) { MovieGenre movieGenre = Movie.MovieGenres.Where(mg => mg.Genre.Id == genreSelection.Genre.Id).FirstOrDefault(); if (genreSelection.Selected) { if (movieGenre == null) { movieGenre = MovieGenre.CreateNew <MovieGenre>(); movieGenre.Genre = genreSelection.Genre; movieGenre.Movie = Movie; Movie.MovieGenres.Add(movieGenre); OnGenreSelectionChanged?.Invoke(genreSelection); } else if (movieGenre.IsDeleted) { movieGenre.IsDeleted = false; } } else if (movieGenre != null) { // Wird ein Genre abgewählt, dass noch nicht gespeichert war, kann es einfach aus der Liste entfernt werden. // War es schon gespeichert, muss es auf Deleted gesetzt werden, damit das Delete in der DB stattfinden kann. if (movieGenre.IsNew) { Movie.MovieGenres.Remove(movieGenre); } else { movieGenre.IsDeleted = true; } OnGenreSelectionChanged?.Invoke(genreSelection); } }
/// <summary> /// Gleicht die Liste der Genres für den Film miot der übergebenen Id mit den Genres ab, deren /// Ids mitgeliefert werden. Neue Genres werden hinzugefügt, entfernte werden auf Deleted gesetzt. /// </summary> /// <param name="movieId">Id des Films, dessen Genres abgeglichen werdem sollem</param> /// <param name="genreIds">Liste der Ids aller Genres, die dem Film zugeordnet werden sollen</param> /// <returns>Alle MovieGenres für den Film (die gelöschten auch mit IsDeleted==true)</returns> public async Task <ICollection <MovieGenre> > SyncMovieGenres(string movieId, IList <string> genreIds) { List <MovieGenre> movieGenres = new List <MovieGenre>(); var movie = await GetWithGenresAndSourcesAsync(movieId); if (movie == null) { return(movieGenres); } movieGenres = movie.MovieGenres.ToList(); var existingMovieGenreIds = movieGenres.Select(m => m.Genre.Id); // Alle zu entfernenden Genres var idsToRemove = (from c1 in existingMovieGenreIds select c1).Except(from c2 in genreIds select c2); foreach (string idToRemove in idsToRemove) { var movieGenreToRemove = movieGenres.Where(g => g.Genre.Id == idToRemove).FirstOrDefault(); movieGenreToRemove.IsDeleted = true; } // Alle neuen Genres var idsToAdd = (from c1 in genreIds select c1).Except(from c2 in existingMovieGenreIds select c2); foreach (string idToAdd in idsToAdd) { var newMovieGenre = MovieGenre.CreateNew <MovieGenre>(); newMovieGenre.Movie = movie; newMovieGenre.Genre = await Resolver.Resolve <IGenreService>().GetAsync(idToAdd); movieGenres.Add(newMovieGenre); } return(movieGenres); }