public ScoredResultDataDTO MapToScoredResultDataDTO(ScoredResultEntity source, ScoredResultDataDTO target = null)
        {
            if (source == null)
            {
                return(null);
            }
            if (target == null)
            {
                target = new ScoredResultDataDTO();
            }

            MapToResultInfoDTO(source.Result, target);
            target.Scoring      = MapToScoringInfoDTO(source.Scoring);
            target.ScoringName  = source.Scoring.Name;
            target.FinalResults = source.FinalResults.Select(x => MapToScoredResultRowDataDTO(x)).OrderBy(x => x.FinalPosition).ToList();

            return(target);
        }
        public ScoredResultDataDTO MapToScoredResultDataDTO(ScoredResultEntity source, ScoredResultDataDTO target = null)
        {
            if (source == null)
            {
                return(null);
            }
            if (target == null)
            {
                target = new ScoredResultDataDTO();
            }

            MapToResultInfoDTO(source.Result, target);
            target.ScoringId              = source.ScoringId; // MapToScoringInfoDTO(source.Scoring);
            target.ScoringName            = source.Scoring.Name;
            target.FinalResults           = source.FinalResults?.Select(x => MapToScoredResultRowDataDTO(x)).OrderBy(x => x.FinalPosition).ToArray();
            target.CleanesDriverMemberIds = source.CleanestDrivers?.Select(x => x.MemberId).ToArray() ?? new long[0];
            target.HardChargerMemberIds   = source.HardChargers?.Select(x => x.MemberId).ToArray() ?? new long[0];
            target.FastestLapDriverId     = source.FastestLapDriver?.MemberId;
            target.FastestQualyLapDriver  = source.FastestQualyLapDriver?.MemberId;
            target.FastestAvgLapDriver    = source.FastestAvgLapDriver?.MemberId;

            return(target);
        }
        /// <summary>
        /// Get the results of a single session
        /// If <paramref name="sessionId"/> == 0 the lates session with attached result is used
        /// </summary>
        /// <param name="sessionId">Id of the session</param>
        /// <returns>Convenience DTO for all session results</returns>
        public SessionResultsDTO GetResultsFromSession(long sessionId, bool includeRawResults = false, ScoredResultDataDTO[] scoredResults = null)
        {
            var mapper = new DTOMapper(DbContext);

            // get session entity from database
            SessionBaseEntity session;

            if (sessionId == 0)
            {
                // if sessionId is 0 get latest session with result
                session = DbContext.Set <SessionBaseEntity>()
                          .Where(x => x.SessionResult != null)
                          .OrderByDescending(x => x.Date)
                          .FirstOrDefault();
            }
            else
            {
                // else get session from sessionId
                session = DbContext.Set <SessionBaseEntity>().Find(sessionId);
            }

            if (session == null)
            {
                return(new SessionResultsDTO()
                {
                    SessionId = sessionId
                });
            }
            sessionId = session.SessionId;

            // get session race number
            int raceNr = 0;

            if (session.SessionType == iRLeagueManager.Enums.SessionType.Race)
            {
                var season         = session.Schedule.Season;
                var seasonSessions = season.Schedules.SelectMany(x => x.Sessions).Where(x => x.SessionType == iRLeagueManager.Enums.SessionType.Race).OrderBy(x => x.Date);
                raceNr = (seasonSessions.Select((x, i) => new { number = i + 1, item = x }).FirstOrDefault(x => x.item.SessionId == sessionId)?.number).GetValueOrDefault();
            }

            // get scoredResults using ModelDataProvider
            var                  modelDataProvider = new ModelDataProvider(DbContext);
            ResultDataDTO        rawResults        = null;
            SimSessionDetailsDTO sessionDetails    = null;

            if (session.SessionResult != null)
            {
                if (scoredResults == null)
                {
                    scoredResults = new ScoredResultDataDTO[0];
                    var ids = session.Scorings.Select(x => new KeyValuePair <long, long>(x.ScoringId, session.SessionId));
                    //scoredResults = session.Scorings.Select(x => modelDataProvider.GetScoredResult(sessionId, x.ScoringId)).ToArray();
                    scoredResults = GetScoredResults(ids);
                }

                // get rawResults if includeRawResults == true
                if (includeRawResults)
                {
                    rawResults = mapper.MapToResulDataDTO(session.SessionResult);
                }

                // get session details
                sessionDetails = mapper.MapToSimSessionDetailsDTO(session.SessionResult.IRSimSessionDetails);
            }

            // construct SessionResultsDTO
            var resultsDTO = new SessionResultsDTO()
            {
                Count          = scoredResults.Count(),
                ScheduleId     = session.ScheduleId,
                ScheduleName   = session.Schedule.Name,
                RaceNr         = raceNr,
                RawResults     = rawResults,
                ScoredResults  = scoredResults,
                SessionId      = sessionId,
                SessionDetails = sessionDetails,
                LocationId     = session.LocationId
            };

            return(resultsDTO);
        }
        public ScoredResultDataDTO[] GetScoredResults(IEnumerable <KeyValuePair <long, long> > scoringSessionIds)
        {
            var scoredResultData = new ScoredResultDataDTO[0];
            var sessionIds       = scoringSessionIds.Select(x => x.Value);
            var scoringIds       = scoringSessionIds.Select(x => x.Key);

            DbContext.Configuration.LazyLoadingEnabled = false;

            /// Load results and check if recalculation needed
            var results = DbContext.Set <ResultEntity>().Where(x => sessionIds.Contains(x.ResultId))
                          .Include(x => x.Session);

            foreach (var result in results)
            {
                if (result.RequiresRecalculation)
                {
                    ILeagueActionProvider leagueActionProvider = new LeagueActionProvider(DbContext);
                    leagueActionProvider.CalculateScoredResult(result.ResultId);
                }
            }

            IEnumerable <ScoredResultEntity> scoredResultEntities = DbContext.Set <ScoredResultEntity>()
                                                                    .Include(x => x.Scoring)
                                                                    .Where(x => sessionIds.Contains(x.ResultId))
                                                                    .ToArray(); // Filter data before fetching from database

            scoredResultEntities = scoringSessionIds
                                   .Select(x => scoredResultEntities
                                           .SingleOrDefault(y => x.Key == y.ScoringId && x.Value == y.ResultId)).ToArray(); // Filter data after fetching from database to the exact needed scoredResults

            DbContext.Set <ScoredResultRowEntity>()
            .Where(x => sessionIds.Contains(x.ScoredResultId) && scoringIds.Contains(x.ScoringId))
            .Include(x => x.ResultRow)
            .Include(x => x.AddPenalty)
            .Include(x => x.ReviewPenalties)
            .Load();

            DbContext.Set <ScoredTeamResultRowEntity>()
            .Where(x => sessionIds.Contains(x.ScoredResultId) && scoringIds.Contains(x.ScoringId))
            .Include(x => x.ScoredResultRows)
            .Load();

            DbContext.Set <IncidentReviewEntity>()
            .Where(x => sessionIds.Contains(x.SessionId))
            .Include(x => x.AcceptedReviewVotes)
            .Load();

            DbContext.ChangeTracker.DetectChanges();

            var memberIds = new List <long>();

            foreach (var scoredResult in scoredResultEntities)
            {
                if (scoredResult.FinalResults != null)
                {
                    foreach (var row in scoredResult.FinalResults)
                    {
                        memberIds.Add(row.MemberId);
                    }
                }
                if (scoredResult is ScoredTeamResultEntity scoredTeamResultEntity && scoredTeamResultEntity.TeamResults != null)
                {
                    var scoredTeamResultRows = scoredTeamResultEntity.TeamResults
                                               .SelectMany(x => x.ScoredResultRows)
                                               .Where(x => x != null);
                    foreach (var row in scoredTeamResultRows)
                    {
                        memberIds.Add(row.MemberId);
                    }
                }
            }
            memberIds = memberIds.Distinct().ToList();

            DbContext.Set <LeagueMemberEntity>()
            .Where(x => memberIds.Contains(x.MemberId))
            .Load();

            //foreach (var scoredResultEntity in scoredResultEntities)
            //{
            //    if (scoredResultEntity is ScoredTeamResultEntity scoredTeamResultEntity)
            //    {
            //        DbContext.Entry(scoredTeamResultEntity).Collection(x => x.TeamResults).Query()
            //            .Include(x => x.ScoredResultRows).Load();
            //    }
            //}

            DbContext.ChangeTracker.DetectChanges();

            var mapper = new DTOMapper(DbContext);

            scoredResultData = scoredResultEntities.Select(x => mapper.MapTo <ScoredResultDataDTO>(x)).ToArray();
            DbContext.Configuration.LazyLoadingEnabled = true;

            return(scoredResultData);
        }
Ejemplo n.º 5
0
        public ScoredResultDataDTO GetScoredResult(long sessionId, long scoringId)
        {
            var scoredResultData = new ScoredResultDataDTO();

            DbContext.Configuration.LazyLoadingEnabled = false;

            /// Load result and check if recalculation needed
            var result = DbContext.Set <ResultEntity>().Where(x => x.ResultId == sessionId)
                         .Include(x => x.Session)
                         .FirstOrDefault();

            if (result == null)
            {
                return(new ScoredResultDataDTO()
                {
                    ResultId = sessionId,
                    ScoringId = scoringId
                });
            }
            else if (result.RequiresRecalculation)
            {
                ILeagueActionProvider leagueActionProvider = new LeagueActionProvider(DbContext);
                leagueActionProvider.CalculateScoredResult(sessionId);
            }

            var scoredResultEntity = DbContext.Set <ScoredResultEntity>()
                                     //.AsNoTracking()
                                     //.Include(x => x.Result.Session)
                                     .Include(x => x.Scoring)
                                     .Include(x => x.HardChargers)
                                     .Include(x => x.CleanestDrivers)
                                     //.Include(x => x.Result.RawResults.Select(y => y.Member))
                                     //.Include(x => x.Result.RawResults.Select(y => y.ScoredResultRows))
                                     //.Include(x => x.FinalResults.Select(y => y.ResultRow.Member))
                                     .FirstOrDefault(x => x.ResultId == sessionId && x.ScoringId == scoringId);

            if (scoredResultEntity == null)
            {
                return new ScoredResultDataDTO()
                       {
                           ResultId  = sessionId,
                           ScoringId = scoringId
                       }
            }
            ;
            //DbContext.Set<ResultEntity>().Where(x => x.ResultId == sessionId)
            //         .Include(x => x.Session).Load();
            DbContext.Set <ScoredResultRowEntity>().Where(x => x.ScoredResultId == sessionId && x.ScoringId == scoringId)
            .Include(x => x.AddPenalty)
            .Include(x => x.ResultRow.Member.Team)
            .Include(x => x.ReviewPenalties).Load();
            //DbContext.Entry(scoredResultEntity).Reference(x => x.Scoring).Load();
            //DbContext.Entry(scoredResultEntity).Reference(x => x.Result).Query().Include(x => x.Session).Load();
            //DbContext.Entry(scoredResultEntity).Collection(x => x.FinalResults).Query()
            //    .Include(x => x.AddPenalty)
            //    .Include(x => x.ResultRow.Member.Team).Load();

            DbContext.Set <IncidentReviewEntity>()
            .Where(x => x.SessionId == sessionId)
            .Include(x => x.AcceptedReviewVotes)
            .Load();

            //if (scoredResultRowIds != null)
            //{
            //    DbContext.Set<ReviewPenaltyEntity>().Where(x => scoredResultRowIds.Contains(x.ResultRowId))
            //    .Include(x => x.ReviewVote.MemberAtFault)
            //    .Include(x => x.ReviewVote.CustomVoteCat)
            //    .Load();
            //}

            if (scoredResultEntity is ScoredTeamResultEntity scoredTeamResultEntity)
            {
                DbContext.Entry(scoredTeamResultEntity).Collection(x => x.TeamResults).Query()
                .Include(x => x.ScoredResultRows).Load();
            }

            DbContext.ChangeTracker.DetectChanges();

            var mapper = new DTOMapper(DbContext);

            scoredResultData = mapper.MapTo <ScoredResultDataDTO>(scoredResultEntity);
            DbContext.Configuration.LazyLoadingEnabled = true;

            return(scoredResultData);
        }