public IEnumerable <Player> GetRecommendedPlayers(long teamId) { var teamOwnerId = _context.TeamsData.Where(t => t.ProfileId == teamId).Select(t => t.OwnerId) .Single(); if (!teamOwnerId.HasValue) { throw new Exception($"There is no team owner for team with teamId = {teamId}"); } var teamOwners = _context.TeamsData.Where(t => t.OwnerId.HasValue) .Select(t => t.OwnerId.GetValueOrDefault()); var reviewers = _context.Reviews.Where(r => r.Rate.HasValue && r.ReviewerProfileId != r.ProfileId) .Select(r => r.ReviewerProfileId); var reviewersTeamOwners = reviewers.Intersect(teamOwners); var teamPlayers = _context.TeamsUsers.Select(tu => tu.UserProfileId); var players = _context.Reviews.Where(r => teamOwners.Contains(r.ProfileId) == false) .Select(r => r.ProfileId); players = players.Where(p => teamPlayers.Contains(p) == false); var reviewerIndexToId = reviewersTeamOwners.OrderBy(r => r).Distinct().ToList(); var playerIndexToId = players.OrderBy(p => p).Distinct().ToList(); var modelFilePath = "model.json"; Recommender recommender = new Recommender(modelFilePath); long playerId; double calculatedRating; int teamOwnerIndex = reviewerIndexToId.IndexOf(teamOwnerId.Value); var playerWithCalculatedRatings = new List <Player>(); for (int i = 0; i < playerIndexToId.Count; i++) { playerId = playerIndexToId[i]; calculatedRating = recommender.GetRating(teamOwnerIndex, i); playerWithCalculatedRatings.Add(new Player { Id = playerId, CalculatedRating = calculatedRating }); } playerWithCalculatedRatings.OrderByDescending(p => p.CalculatedRating); foreach (var player in playerWithCalculatedRatings) { var profiles = _context.ProfilesRatings.Where(p => p.ProfileId == player.Id); if (profiles.Count() > 0) { var ratings = profiles.Select(p => p.Rating); player.AverageRating = ratings.Average(); } } playerWithCalculatedRatings = playerWithCalculatedRatings.Where(p => p.AverageRating > 0).ToList(); return(playerWithCalculatedRatings); }