In the previous part we have determined that:
- IQueryably consists of a Provider and an Expression Tree
- Expression Trees can be combined almost as easily as pieces of C# code
In this article, we will look at treating our queries are reusable chunks of logic and combining them into more complex yet still readable queries like this:
public IQueryable<ProductModelOrderStatisticsDto> GetProductModelOrderStats()
{
// a bigger, more detailed query
IQueryable<WorkOrderSummaryDto> allDurationsAndRoutings =
GetWorkOrderSummaries();
// is wrapped by an aggregation to retrieve statistics
var averagePerModel = allDurationsAndRoutings
.GroupBy(x => new { x.ProductModelId, x.ModelName })
.Select(x => new ProductModelOrderStatisticsDto
{
ModelId = x.Key.ProductModelId,
ModelName = x.Key.ModelName,
AverageDuration = x.Where(y => y.DurationDays.HasValue)
.Average(y => y.DurationDays.Value),
AverageRoutings = x.Average(y => y.RoutingsCount)
});
return averagePerModel;
}