public async Task <int> GenerateRecommendation(RecommendationParameters parameters) { var context = new Database.DatabaseContext(_dbContextOptions); var recommendedMovieIds = await GetRecommendedMovieIds(context, parameters); var recommendation = new Database.Recommendation() { Date = DateTime.Now, UserId = parameters.UserId }; context.Add(recommendation); await context.SaveChangesAsync(); var recommendedMovies = recommendedMovieIds.Select(rm => new Database.RecommendedMovie() { RecommendationId = recommendation.Id, MovieId = rm, PossibleRating = 0.0f, }); context.AddRange(recommendedMovies); await context.SaveChangesAsync(); return(0); }
public async Task <int> GenerateRecommendation(RecommendationParameters parameters) { var context = new Database.DatabaseContext(_dbContextOptions); var recommendedMovies = ( from movies in context.Movies join tags in context.MovieTags on movies.Id equals tags.MovieId where parameters.RequestedTagIds.Contains(tags.TagId) select new { movies.Id, Rating = movies.AverageRating, } ).Distinct().OrderByDescending(movie => movie.Rating).Take(10); if (recommendedMovies.Count() == 0) { return(0); } var recommendation = new Database.Recommendation() { UserId = parameters.UserId, }; context.Recommendations.Attach(recommendation); context.Recommendations.Add(recommendation); await context.SaveChangesAsync(); foreach (var movie in await recommendedMovies.ToListAsync()) { var recommendedMovie = new Database.RecommendedMovie() { MovieId = movie.Id, PossibleRating = movie.Rating, RecommendationId = recommendation.Id, }; context.RecommendedMovies.Attach(recommendedMovie); context.RecommendedMovies.Add(recommendedMovie); } await context.SaveChangesAsync(); context.Dispose(); return(recommendation.Id); }