public async Task <OperationDataResult <int> > GetTransactionsCountAsync(TransactionFiltersModel transactionFiltersModel) { var transactionsCount = await _applicationContext.Transactions .Where(transaction => (transactionFiltersModel.Statuses == null ? true : transactionFiltersModel.Statuses.Contains(transaction.Status)) && (transactionFiltersModel.Types == null ? true : transactionFiltersModel.Types.Contains(transaction.Type))) .AsNoTracking() .CountAsync(); return(new OperationDataResult <int>(true, transactionsCount)); }
public async Task <OperationDataResult <string> > ExportTransactionsAsync(TransactionFiltersModel transactionFiltersModel) { var builder = new StringBuilder(); builder.AppendLine("TransactionId,Status,Type,ClientName,Amount"); await foreach (var transactionChunk in _applicationContext.Transactions.ToChunks(transactionFiltersModel)) { foreach (var transaction in transactionChunk) { builder.AppendLine($"{transaction.Id},{transaction.Status},{transaction.Type},{transaction.ClientName},${transaction.Amount}"); } } return(new OperationDataResult <string>(true, model: builder.ToString())); }
public async Task <IActionResult> GetTransactionsCount([FromQuery] TransactionFiltersModel transactionFiltersModel) { var result = await _transactionService.GetTransactionsCountAsync(transactionFiltersModel); return(result.Success ? (IActionResult)Ok(result.Model) : StatusCode(500)); }
public async Task <IActionResult> GetExportedTransactions([FromQuery] TransactionFiltersModel transactionFiltersModel) { var result = await _transactionService.ExportTransactionsAsync(transactionFiltersModel); return(result.Success ? File(Encoding.UTF8.GetBytes(result.Model), "text/csv", "data.csv") : (IActionResult)StatusCode(500)); }
public static async IAsyncEnumerable <List <TransactionModel> > ToChunks(this DbSet <Transaction> transactions, TransactionFiltersModel transactionFiltersModel) { int count = transactions.Count(); for (int i = 0; i < count; i += transactionSegmentCount) { var transactionModels = await transactions .Where(transaction => (transactionFiltersModel.Statuses == null)?true : transactionFiltersModel.Statuses.Contains(transaction.Status)) .Where(transaction => (transactionFiltersModel.Types == null) ? true : transactionFiltersModel.Types.Contains(transaction.Type)) .AsNoTracking() .OrderBy(transaction => transaction.Id) .Skip(i) .Select(transaction => new TransactionModel { Id = transaction.Id, Status = transaction.Status, Type = transaction.Type, ClientName = transaction.Client.Name, Amount = transaction.Amount }) .Take(transactionSegmentCount) .ToListAsync(); yield return(transactionModels); } }