public async Task RecordValueHistory(VooperContext context, string type, DateTime time) { Stopwatch sw = new Stopwatch(); sw.Start(); // First clear outdated records if (type == "MINUTE") { context.RemoveRange(context.ValueHistory.AsQueryable().Where(v => v.Type == "MINUTE" && EF.Functions.DateDiffMinute(v.Time, time) > 2000)); } else if (type == "HOUR") { context.RemoveRange(context.ValueHistory.AsQueryable().Where(v => v.Type == "HOUR" && EF.Functions.DateDiffHour(v.Time, time) > 2000)); } else if (type == "DAY") { context.RemoveRange(context.ValueHistory.AsQueryable().Where(v => v.Type == "DAY" && EF.Functions.DateDiffDay(v.Time, time) > 2000)); } // Add new records List <ValueHistory> additions = new List <ValueHistory>(); // User Portfolios foreach (Entity user in context.Users) { decimal portValue = await user.GetPortfolioValue(); if (portValue > 0) { ValueHistory hist = new ValueHistory() { Id = Guid.NewGuid().ToString(), Account_Id = user.Id, Time = time, Type = type, Value = Math.Min(portValue, 9999999999M) }; additions.Add(hist); } } // Group Portfolios foreach (Entity group in context.Groups) { decimal portValue = await group.GetPortfolioValue(); if (portValue > 0) { ValueHistory hist = new ValueHistory() { Id = Guid.NewGuid().ToString(), Account_Id = group.Id, Time = time, Type = type, Value = Math.Min(portValue, 9999999999M) }; additions.Add(hist); } } // Stocks foreach (StockDefinition stock in context.StockDefinitions) { decimal value = stock.Current_Value; int volume = 0; Dictionary <string, int> volumesDict = null; if (type == "MINUTE") { volumesDict = ExchangeManager.VolumesMinute; } else if (type == "HOUR") { volumesDict = ExchangeManager.VolumesHour; } else { volumesDict = ExchangeManager.VolumesDay; } if (volumesDict.ContainsKey(stock.Ticker)) { volume = volumesDict[stock.Ticker]; volumesDict[stock.Ticker] = 0; } ValueHistory hist = new ValueHistory() { Id = Guid.NewGuid().ToString(), Account_Id = stock.Ticker, Time = time, Type = type, Value = Math.Min(value, 9999999999M), Volume = volume }; additions.Add(hist); } await context.AddRangeAsync(additions); await context.SaveChangesAsync(); sw.Stop(); _logger.LogInformation($"Added {additions.Count} financial records in {sw.Elapsed.Seconds} seconds."); }