public void Calculate() { using (var scope = serviceScopeFactory.CreateScope()) { var dbContext = scope.ServiceProvider.GetRequiredService <ApplicationDbContext>(); var divisions = dbContext.Results.AsNoTracking().Select(x => x.Division).Distinct().ToList(); foreach (var division in divisions) { var testResults = dbContext.Results.AsNoTracking().Include(x => x.MatchOdds).Where(x => x.Division == division && x.MatchOdds != null).ToList(); var accuracy = new Models.Accuracy(); accuracy.Division = division; accuracy.Matches = testResults.Count(); accuracy.Recommended = testResults.Where(x => x.MatchOdds.IsRecommended).Count(); accuracy.LowerRecommended = testResults.Where(x => x.MatchOdds.IsLowerRecommended).Count(); accuracy.RecommendedAccuracy = Math.Round(DecimalExtensions.SafeDivide(testResults.Where(x => x.MatchOdds.Recommended == x.FullTimeResult).Count(), accuracy.Recommended), 2); accuracy.LowerRecommendedAccuracy = Math.Round(DecimalExtensions.SafeDivide(testResults.Where(x => x.MatchOdds.LowerRecommended == x.FullTimeResult).Count(), accuracy.LowerRecommended), 2); accuracy.Calculated = DateTime.UtcNow; dbContext.Accuracy.Upsert(accuracy) .On(x => new { x.Division }) .Run(); } } }
private static string ConvertToDecimalPrintable(decimal?theValue, int places = 2) { var result = theValue.HasValue ? DecimalExtensions.RoundUp((double)theValue, places).ToString("N" + places) : string.Empty; return(result); }