Ejemplo n.º 1
0
        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);
        }