/// <summary>
        /// <para>Load all data required for calculating the statistics from the database.</para>
        /// <para>Must be called prior to <see cref="Calculate"/> if lazy loading is disabled!</para>
        /// </summary>
        /// <param name="dbContext">Database context from EntityFramework.</param>
        /// <param name="force">Force loading data again even if IsDataLoaded is true.</param>
        public virtual async Task LoadRequiredDataAsync(LeagueDbContext dbContext, bool force = false)
        {
            if (DriverStatistic == null || DriverStatistic.Count == 0)
            {
                await dbContext.Entry(this)
                .Collection(x => x.DriverStatistic)
                .LoadAsync();

                var memberIds  = DriverStatistic.Select(x => x.MemberId);
                var sessionIds = DriverStatistic
                                 .SelectMany(x => new long?[] { x.FirstSessionId, x.LastSessionId, x.FirstRaceId, x.LastRaceId })
                                 .Where(x => x != null)
                                 .Select(x => x.Value);
                var resultRowIds = DriverStatistic
                                   .SelectMany(x => new long?[] { x.FirstResultRowId, x.LastResultRowId })
                                   .Where(x => x != null)
                                   .Select(x => x.Value);

                await dbContext.Set <LeagueMemberEntity>()
                .Where(x => memberIds.Contains(x.MemberId))
                .LoadAsync();

                await dbContext.Set <SessionBaseEntity>()
                .Where(x => sessionIds.Contains(x.SessionId))
                .LoadAsync();

                await dbContext.Set <ResultRowEntity>()
                .Where(x => resultRowIds.Contains(x.ResultRowId))
                .LoadAsync();

                dbContext.ChangeTracker.DetectChanges();
            }
        }
Exemplo n.º 2
0
        private static async Task Tick(string leagueDbName)
        {
            // Load statistic sets and check for recalculation interval
            using (var dbContext = new LeagueDbContext(leagueDbName))
            {
                var statisticSets      = dbContext.Set <StatisticSetEntity>().ToList();
                var checkStatisticSets = statisticSets.Where(x => IsDueTick(x.UpdateTime, TimeSpanConverter.Convert(x.UpdateInterval))).OrderBy(x => GetTypePriority(x));


                dbContext.Configuration.LazyLoadingEnabled = false;
                foreach (var statisticSet in checkStatisticSets)
                {
                    await statisticSet.CheckRequireRecalculationAsync(dbContext);

                    if (statisticSet.RequiresRecalculation)
                    {
                        await statisticSet.LoadRequiredDataAsync(dbContext);

                        statisticSet.Calculate(dbContext);
                    }
                }
                dbContext.Configuration.LazyLoadingEnabled = true;
                dbContext.SaveChanges();
            }
            GC.Collect();
        }
        static void Main(string[] args)
        {
            // Create season statistic set
            //using (var dbContext = new LeagueDbContext("SkippyCup_leagueDb"))
            //{
            //    var season = dbContext.Seasons.Find(1);

            //    var seasonStatistics = new SeasonStatisticSetEntity();
            //    season.SeasonStatistics.Add(seasonStatistics);

            //    var sprintScoring = dbContext.Set<ScoringEntity>().Find(7);
            //    var enduranceScoring = dbContext.Set<ScoringEntity>().Find(8);

            //    seasonStatistics.Scorings.Add(sprintScoring);
            //    seasonStatistics.Scorings.Add(enduranceScoring);

            //    dbContext.SaveChanges();
            //}

            // Calculate season statistics
            using (var dbContext = new LeagueDbContext("SkippyCup_leagueDb"))
            {
                var seasonStatistics = dbContext.Set <SeasonStatisticSetEntity>().ToList();

                dbContext.Configuration.LazyLoadingEnabled = false;

                seasonStatistics.ForEach(x => x.LoadRequiredDataAsync(dbContext).Wait());
                seasonStatistics.ForEach(x => x.Calculate(dbContext));

                dbContext.SaveChanges();
            }

            // Create league statistic set
            //using (var dbContext = new LeagueDbContext("SkippyCup_leagueDb"))
            //{
            //    var leagueStatistic = new LeagueStatisticSetEntity();
            //    dbContext.LeagueStatistics.Add(leagueStatistic);

            //    leagueStatistic.StatisticSets.Add(dbContext.Seasons.First().SeasonStatistics.First());
            //    leagueStatistic.StatisticSets.Add(dbContext.Seasons.First().SeasonStatistics.Last());

            //    dbContext.SaveChanges();
            //}

            // Calculate league statistics
            using (var dbContext = new LeagueDbContext("SkippyCup_leagueDb"))
            {
                var leagueStatistic = dbContext.Set <LeagueStatisticSetEntity>().First();

                dbContext.Configuration.LazyLoadingEnabled = false;

                leagueStatistic.LoadRequiredDataAsync(dbContext).Wait();
                leagueStatistic.Calculate(dbContext);

                dbContext.SaveChanges();
            }

            //Console.Read();
        }
        public override void Delete(LeagueDbContext dbContext)
        {
            AddPenalty?.Delete(dbContext);
            ReviewPenalties?.ToList().ForEach(x => x.Delete(dbContext));
            dbContext.Set <DriverStatisticRowEntity>()
            .Where(x => x.LastResultRowId == ScoredResultRowId || x.FirstResultRowId == ScoredResultRowId)
            .Load();

            base.Delete(dbContext);
        }
Exemplo n.º 5
0
        public TResult Execute <TSet, TResult>(IQuery <TSet, TResult> query) where TSet : class
        {
            if (query is null)
            {
                throw new System.ArgumentNullException(nameof(query));
            }

            var set = db.Set <TSet>();

            return(query.Execute(set));
        }
Exemplo n.º 6
0
 public virtual void Delete(LeagueDbContext dbContext)
 {
     dbContext.Set(this.GetType()).Remove(this);
 }
Exemplo n.º 7
0
        public override async Task LoadRequiredDataAsync(LeagueDbContext dbContext, bool force = false)
        {
            if (IsDataLoaded && force == false)
            {
                return;
            }

            await base.LoadRequiredDataAsync(dbContext, force);

            if (Season == null)
            {
                await dbContext.Entry(this)
                .Reference(x => x.Season)
                .LoadAsync();
            }
            //if (DriverStatistic == null || DriverStatistic.Count == 0)
            //{
            //    await dbContext.Entry(this)
            //        .Collection(x => x.DriverStatistic)
            //        .LoadAsync();
            //}

            if (ScoringTableId == null || ScoringTableId == 0)
            {
                return;
            }

            var scoringTable = dbContext.Set <ScoringTableEntity>()
                               .Where(x => x.ScoringTableId == ScoringTableId)
                               .Include(x => x.Scorings.Select(y => y.ExtScoringSource))
                               //.Include(x => x.Scorings.Select(y => y.Sessions.Select(z => z.SessionResult)))
                               //.Include(x => x.Scorings.Select(y => y.ScoredResults.Select(z => z.FinalResults.Select(q => q.ResultRow.Member))))
                               //.Include(x => x.Scorings.Select(y => y.ExtScoringSource.ScoredResults.Select(z => z.FinalResults.Select(q => q.ResultRow.Member))))
                               .FirstOrDefault();
            var loadScoringEntityIds = dbContext.Set <ScoringEntity>().Local.Select(y => y.ScoringId);

            if (loadScoringEntityIds.Count() > 0)
            {
                var loadScorings = dbContext.Set <ScoringEntity>()
                                   .Where(x => loadScoringEntityIds.Contains(x.ScoringId))
                                   .Include(x => x.Sessions.Select(y => y.SessionResult))
                                   .ToList();
                var loadScoredResults = dbContext.Set <ScoredResultEntity>()
                                        .Where(x => loadScoringEntityIds.Contains(x.ScoringId))
                                        .Include(x => x.FinalResults.Select(y => y.ResultRow.Member))
                                        .Include(x => x.CleanestDrivers)
                                        .Include(x => x.HardChargers)
                                        .ToList();
            }

            var scorings = scoringTable.Scorings;

            foreach (var scoring in scorings)
            {
                await dbContext.Entry(scoring)
                .Reference(x => x.ConnectedSchedule)
                .Query()
                .Include(x => x.Sessions)
                .LoadAsync();

                await dbContext.Entry(scoring)
                .Collection(x => x.Sessions)
                .LoadAsync();

                scoring.GetAllSessions();
            }

            var scoringIds = scorings.Select(y => y.ScoringId);

            await dbContext.Set <ScoredResultEntity>()
            .Where(x => scoringIds.Contains(x.ScoringId))
            .Include(x => x.FinalResults.Select(y => y.AddPenalty))
            .Include(x => x.FinalResults.Select(y => y.ReviewPenalties))
            .LoadAsync();

            var resultIds = scorings.SelectMany(x => x.ScoredResults.Select(y => y.ResultId));

            await dbContext.Set <ResultEntity>()
            .Where(x => resultIds.Contains(x.ResultId))
            .Include(x => x.RawResults.Select(y => y.Member.Team))
            .Include(x => x.IRSimSessionDetails)
            .Include(x => x.Session.Reviews.Select(y => y.AcceptedReviewVotes.Select(z => z.CustomVoteCat)))
            .LoadAsync();

            dbContext.ChangeTracker.DetectChanges();

            IsDataLoaded = true;
        }