public static IEnumerable <Exchange> RetrieveAndPopulateExchanges(IEnumerable <DateTime> datesToRetrieve, string targetCurrencyCode, DbSet <Exchange> exchangesDbSet)
        {
            var retrievedExchanges = Enumerable.Empty <Exchange>();

            foreach (var dateToProcess in datesToRetrieve)
            {
                IEnumerable <Exchange> exchangesOfDate;
                try
                {
                    try
                    {
                        exchangesOfDate = RequestDefaultExternalResource(dateToProcess, targetCurrencyCode);
                    }
                    catch (ExchangeResource.ResourceBrokageException rbEx)
                    {
                        throw new ExchangeResource.NotifyResourceMaintainer("The resource is broken or violates protocol.", rbEx);
                    }
                    catch (ExchangeResource.BaseException)
                    {
                        throw;
                    }
                    catch (Exception ex)
                    {
                        var erEx = new ExchangeResource.NotifyResourceDeveloper(ex);
                        erEx.AddFailedDate(dateToProcess);
                        throw erEx;
                    }
                }
                catch (ExchangeResource.BaseException resEx)
                {
                    var triedDates     = retrievedExchanges.Select(e => e.Date).Concat(resEx.GetFailedDates());
                    var untouchedDates = datesToRetrieve.Except(triedDates);
                    resEx.AddUntouchedDates(untouchedDates);
                    throw;
                }
                foreach (var exchange in exchangesOfDate)
                {
                    exchangesDbSet.Add(exchange); // TODO: dangerous if given exchange is in the DB already. `SaveChanges` will fail (and drop other changes?).
                }
                Trace.WriteLine("Database is populated with " + exchangesOfDate.Count() + " entries for date " + dateToProcess.ToString("yyyy-MM-dd") + ".");
                retrievedExchanges = retrievedExchanges.Concat(exchangesOfDate);
                var targetExchanges = exchangesOfDate.Where(ex => ex.CurrencyCode == targetCurrencyCode);
                if (targetExchanges.Count() == 0)
                {
                    var resEx = new ExchangeResource.TryRequestingOtherDatesOrCurrency(
                        String.Format(
                            "No rates for currency code {0} on {1}.",
                            targetCurrencyCode,
                            dateToProcess.ToString("yyyy-MM-dd")
                            )
                        );
                    resEx.AddFailedDate(dateToProcess);
                    throw resEx;
                }
            }
            return(retrievedExchanges);
        }
 public static IEnumerable<Exchange> RetrieveAndPopulateExchanges(IEnumerable<DateTime> datesToRetrieve, string targetCurrencyCode, DbSet<Exchange> exchangesDbSet)
 {
     var retrievedExchanges = Enumerable.Empty<Exchange>();
     foreach (var dateToProcess in datesToRetrieve)
     {
         IEnumerable<Exchange> exchangesOfDate;
         try
         {
             try
             {
                 exchangesOfDate = RequestDefaultExternalResource(dateToProcess, targetCurrencyCode);
             }
             catch (ExchangeResource.ResourceBrokageException rbEx)
             {
                 throw new ExchangeResource.NotifyResourceMaintainer("The resource is broken or violates protocol.", rbEx);
             }
             catch (ExchangeResource.BaseException)
             {
                 throw;
             }
             catch (Exception ex)
             {
                 var erEx = new ExchangeResource.NotifyResourceDeveloper(ex);
                 erEx.AddFailedDate(dateToProcess);
                 throw erEx;
             }
         }
         catch (ExchangeResource.BaseException resEx)
         {
             var triedDates = retrievedExchanges.Select(e => e.Date).Concat(resEx.GetFailedDates());
             var untouchedDates = datesToRetrieve.Except(triedDates);
             resEx.AddUntouchedDates(untouchedDates);
             throw;
         }
         foreach (var exchange in exchangesOfDate)
             exchangesDbSet.Add(exchange); // TODO: dangerous if given exchange is in the DB already. `SaveChanges` will fail (and drop other changes?).
         Trace.WriteLine("Database is populated with "+exchangesOfDate.Count()+" entries for date "+dateToProcess.ToString("yyyy-MM-dd")+".");
         retrievedExchanges = retrievedExchanges.Concat(exchangesOfDate);
         var targetExchanges = exchangesOfDate.Where(ex => ex.CurrencyCode == targetCurrencyCode);
         if (targetExchanges.Count() == 0)
         {
             var resEx = new ExchangeResource.TryRequestingOtherDatesOrCurrency(
                 String.Format(
                     "No rates for currency code {0} on {1}.",
                     targetCurrencyCode,
                     dateToProcess.ToString("yyyy-MM-dd")
                 )
             );
             resEx.AddFailedDate(dateToProcess);
             throw resEx;
         }
     }
     return retrievedExchanges;
 }