public async Task <IEnumerable <FxRate> > GetFxRatesAsync(DateTime?fxRateDate, string viewMode) { if (fxRateDate == null && viewMode != FxRateViewMode.Spot) { throw new Exception("The fxRateDate is required for viewMode other than Spot."); } if (viewMode != FxRateViewMode.Spot && viewMode != FxRateViewMode.Daily && viewMode != FxRateViewMode.Monthly) { throw new Exception("Invalid value for viewMode."); } IEnumerable <Currency> currencies = (await GetCurrenciesAsync()).ToList(); IEnumerable <FxRateRecord> fxRateRecords = await _masterDataRepository.GetFxRatesAsync(fxRateDate, viewMode); var fxRatesJoinList = (from fxRate in fxRateRecords join currency in currencies on fxRate.CurrencyCodeFrom equals currency.CurrencyCode into currenciesFrom from cf in currenciesFrom.DefaultIfEmpty() join currency in currencies on fxRate.CurrencyCodeTo equals currency.CurrencyCode into currenciesTo from ct in currenciesTo.DefaultIfEmpty() select new { FxRate = fxRate, CurrencyFrom = cf, CurrencyTo = ct }).ToList(); // Filters out the values which do not meet the codes & types (for ex, EUR=>INR, or USD=>EUR if EUR is of type 'M') var fxRateRecordsFiltered = fxRatesJoinList .Where(r => (r.CurrencyFrom != null && r.CurrencyTo != null) && (r.CurrencyFrom.IsDollar() || r.CurrencyTo.IsDollar())) .Where(r => (r.CurrencyFrom != null && r.CurrencyFrom.IsDollar() && r.CurrencyTo.RoeType == "D") || (r.CurrencyTo != null && r.CurrencyFrom.RoeType == "M" && r.CurrencyTo.IsDollar())).ToList(); var fxRates = (from r in fxRateRecordsFiltered let c = r.CurrencyFrom.RoeType == "M" && !r.CurrencyFrom.IsDollar() ? r.CurrencyFrom : r.CurrencyTo select new FxRate { CurrencyCode = c.CurrencyCode, CurrencyRoeType = c.RoeType, Date = r.FxRate.ValidDateFrom, Rate = r.FxRate.Rate, FwdMonth1 = r.FxRate.FwdMonth1, FwdMonth2 = r.FxRate.FwdMonth2, FwdMonth3 = r.FxRate.FwdMonth3, FwdMonth6 = r.FxRate.FwdMonth6, FwdYear1 = r.FxRate.FwdYear1, FwdYear2 = r.FxRate.FwdYear2, CurrencyIsDeactivated = c.IsDeactivated, CreatedBy = r.FxRate.CreatedBy, CreatedDateTime = r.FxRate.CreatedDateTime, ModifiedBy = r.FxRate.ModifiedBy, ModifiedDateTime = r.FxRate.ModifiedDateTime }) .ToList(); foreach (var currency in currencies) { if (fxRates.All(r => r.CurrencyCode != currency.CurrencyCode)) { fxRates.Add(new FxRate { CurrencyCode = currency.CurrencyCode, CurrencyRoeType = currency.RoeType, CurrencyIsDeactivated = currency.IsDeactivated, CurrencyDescription = currency.Description }); } } return(fxRates); }