public Task <IAssetAggregation> Aggregate(IAssetSearchQuery searchRequest, CancellationToken cancellationToken) { using (var context = new AssetRegisterContext(_databaseUrl)) { var filteringCriteria = GenerateFilteringCriteria(context, searchRequest); var aggregatedData = filteringCriteria.Select(s => new { AssetValue = s.AgencyFairValue, MoneyPaidOut = s.AgencyEquityLoan, SchemeId = s.SchemeId, }); decimal?uniqueCount = aggregatedData?.Select(w => w.SchemeId).Distinct().Count(); decimal?moneyPaidOut = aggregatedData?.Select(w => w.MoneyPaidOut).Sum(s => s); decimal?assetValue = aggregatedData?.Select(w => w.AssetValue).Sum(s => s); IAssetAggregation assetAggregates = new AssetAggregation { UniqueRecords = uniqueCount, AssetValue = assetValue, MoneyPaidOut = moneyPaidOut, MovementInAssetValue = assetValue - moneyPaidOut }; return(Task.FromResult(assetAggregates)); } }
private IQueryable <AssetEntity> GenerateFilteringCriteria(AssetRegisterContext context, IAssetSearchQuery searchRequest) { IQueryable <AssetEntity> queryable = context.Assets; if (!searchRequest.AssetRegisterVersionId.HasValue) { throw new ArgumentNullException("AssetRegisterVersionId is null"); } queryable = queryable.Where(w => w.AssetRegisterVersionId.Equals(searchRequest.AssetRegisterVersionId)); if (!string.IsNullOrEmpty(searchRequest.Address) && !string.IsNullOrWhiteSpace(searchRequest.Address)) { queryable = queryable.Where(w => EF.Functions.Like(w.Address.ToLower(), $"%{searchRequest.Address}%".ToLower())); } if (!string.IsNullOrEmpty(searchRequest.Region) && !string.IsNullOrWhiteSpace(searchRequest.Region)) { queryable = queryable.Where(w => EF.Functions.Like(w.ImsOldRegion.ToLower(), $"%{searchRequest.Region}%".ToLower())); } if (!string.IsNullOrEmpty(searchRequest.Developer) && !string.IsNullOrWhiteSpace(searchRequest.Developer)) { queryable = queryable.Where(w => EF.Functions.Like(w.DevelopingRslName.ToLower(), $"%{searchRequest.Developer}%".ToLower())); } if (searchRequest.SchemeId.HasValue && searchRequest?.SchemeId.Value > 0) { queryable = queryable.Where(w => w.SchemeId.HasValue && w.SchemeId == searchRequest.SchemeId.Value); } queryable = queryable.OrderByDescending(w => w.SchemeId); return(queryable); }