public async Task <IList <AccountDto> > GetAccounts(AccountSearchParameters accountSearchParameters) { Expression <Func <Account, bool> > predicate = account => (accountSearchParameters.Currencies == null || accountSearchParameters.Currencies.Any(currency => account.Currency.Contains(currency))) && (accountSearchParameters.AccountIds == null || accountSearchParameters.AccountIds.Any(accountId => account.Id == accountId)) && (accountSearchParameters.Exchanges == null || accountSearchParameters.Exchanges.Any(bank => account.Exchange.Contains(bank))); var accounts = await _dbRepository .WhereAsync <Account, AccountDto>(predicate); if (!accountSearchParameters.MergeAccountsWithSameNameFromDifferentExchanges) { return(accounts); } var mergedAccounts = new Dictionary <string, AccountDto>(); foreach (var account in accounts) { if (mergedAccounts.TryGetValue(account.Currency, out var mergedAccount)) { mergedAccount.Balance += account.Balance; mergedAccount.Exchange += $", {account.Exchange}"; mergedAccount.MergedAccount = true; } else { mergedAccounts.Add(account.Currency, account); } } return(mergedAccounts.Values.ToList()); }
public async Task <IActionResult> Accounts(AccountSearchParameters accountSearchParameters) { var accounts = await _accountProvider.GetAccounts(accountSearchParameters); return(Ok(accounts)); }