public async Task <ConsumersReport> GetConsumersReportAsync(GetConsumersReport query) { var consumers = await _consumerRepository.BrowseAsync(new GetConsumers { Results = int.MaxValue }); if (!consumers.Items.Any()) { return(ConsumersReport.Empty); } var paymentClaims = await _paymentClaimRepository.BrowseAsync(new GetPaymentClaims { Page = 1, Results = int.MaxValue, DepositId = query.DepositId, AssetId = query.AssetId, Consumer = query.Consumer }); var depositsPaymentClaimGroups = paymentClaims.Items.GroupBy(c => c.DepositId).Where(c => c.Any()); var page = query.Page; if (page <= 0) { page = 1; } var results = query.Results; if (results <= 0) { results = 10; } var skip = (page - 1) * results; var items = (from depositsPaymentClaimsGroup in depositsPaymentClaimGroups.Skip(skip).Take(results) let consumer = consumers.Items.FirstOrDefault(c => c.DepositId == depositsPaymentClaimsGroup.Key) where !(consumer is null) let payments = CalculatePayments(depositsPaymentClaimsGroup) select new ConsumerReportItem(consumer.DataAsset.Id, consumer.DataAsset.Name, consumer.DataRequest.Consumer, consumer.DepositId, consumer.DataRequest.Value, payments.Claimed, payments.Pending, payments.Income)).ToList(); var totalResults = items.Count(); var totalPages = (int)Math.Ceiling((double)totalResults / query.Results); var paymentsSummary = await _paymentClaimRepository.GetPaymentsSummary(assetId : query.AssetId, consumer : query.Consumer); return(new ConsumersReport(paymentsSummary.Claimed, paymentsSummary.Pending, paymentsSummary.Income, PagedResult <ConsumerReportItem> .Create(items, query.Page, query.Results, totalPages, totalResults))); }