/// <summary> /// Get list of exchange rates history entities for specific period (from model) for specific currency /// </summary> /// <param name="statisticsModel">Data Model</param> /// <param name="currencyCode">Currency Code</param> /// <returns></returns> private List<ExchangeRatesHistory> GetExchangeRatesForCurrency(ExchangeRatesStatisticsModel statisticsModel, string currencyCode) { List<ExchangeRatesHistory> ratesHistory = new List<ExchangeRatesHistory>(); try { using (ExchangeRatesDataModelContainer dbModel = new ExchangeRatesDataModelContainer()) { //Extract existing data from database ratesHistory = dbModel.ExchangeRatesHistories .Where(r => r.Date >= statisticsModel.StartDate && r.Date <= statisticsModel.EndDate && (r.Currency.ServiceCode == currencyCode)) .ToList(); } } catch (Exception e) { throw new ApplicationException("Unable to get rates history from Database", e); } for (DateTime currentDate = statisticsModel.StartDate; currentDate <= statisticsModel.EndDate; currentDate = currentDate.AddDays(1)) { List<ExchangeRatesHistory> existingRate = ratesHistory .Where(rh => rh.Date == currentDate).ToList(); if (existingRate.Count == 0) { List<ExchangeRatesHistory> ratesFromService = GetExchangeRatesFromService(currentDate) .Where(r => r.Currency.ServiceCode == currencyCode).ToList(); AddRatesToDb(ratesFromService); ratesHistory.AddRange(ratesFromService); } } return ratesHistory; }
/// <summary> /// Add new exchange rates history entries to database /// </summary> /// <param name="rates">list of entities to add</param> private void AddRatesToDb(List<ExchangeRatesHistory> rates) { try { using (ExchangeRatesDataModelContainer dbModel = new ExchangeRatesDataModelContainer()) { foreach (var rate in rates) { rate.Currency = dbModel.Currencies.Where(c => c.ServiceCode == rate.Currency.ServiceCode).First(); dbModel.ExchangeRatesHistories.AddObject(rate); } dbModel.SaveChanges(); } } catch (Exception e) { throw new ApplicationException("Unable to add rates history to Database", e); } }