public async Task <StatusCountDto> GetStatusCount(int forUserId = -1, DateTime?fromDate = null, DateTime?toDate = null) { var result = new StatusCountDto { FromDate = fromDate, ToDate = toDate }; AppUser user = null; if (forUserId != -1) { user = await userRepo.GetById(forUserId); if (user == null) { return(result); } result.TargetUser = mapper.Map <UserSummaryDto>(user); } var documents = filteringService.Filter(docRepo.GetAll(), user, fromDate: fromDate, toDate: toDate); result.DocumentsCurrentStatusCount = reportingService.CountDocumentsByStatus(documents); result.TotalDocuments = result.DocumentsCurrentStatusCount.Values.Sum(); // TODO - move status filtering logic to another place bool historyPredicate(DocumentHistoryEntry e) { if (user != null && e.User.Id != user.Id) { return(false); } if (fromDate.HasValue && e.Created < fromDate.Value) { return(false); } if (toDate.HasValue && e.Created > toDate.Value) { return(false); } return(true); } var statusChanges = historyRepo.GetAll().Where(historyPredicate); result.StatusChangesCount = reportingService.CountStatusChanges(statusChanges.AsQueryable()); result.TotalChanges = result.StatusChangesCount.Values.Sum(); return(result); }