public override async Task <ResultTable> ExecuteQueryGroupAsync(QueryRequest request, CancellationToken cancellationToken) { var simpleFilters = request.Filters.Where(f => !f.IsAggregate()).ToList(); var aggregateFilters = request.Filters.Where(f => f.IsAggregate()).ToList(); var keys = request.Columns.Select(t => t.Token).Where(t => !(t is AggregateToken)).ToHashSet(); var allAggregates = request.AllTokens().OfType <AggregateToken>().ToHashSet(); var qr = new QueryRequest { Columns = keys.Concat(allAggregates.Select(at => at.Parent).NotNull()).Distinct().Select(t => new Column(t, t.NiceName())).ToList(), Orders = new List <Order>(), Filters = simpleFilters, QueryName = request.QueryName, Pagination = new Pagination.All(), }; DEnumerableCount <T> plainCollection = await Execute(qr, GetQueryDescription(), cancellationToken); var groupCollection = plainCollection .GroupBy(keys, allAggregates) .Where(aggregateFilters) .OrderBy(request.Orders); var cols = groupCollection.TryPaginate(request.Pagination); return(cols.ToResultTable(request)); }
public override ResultTable ExecuteQueryGroup(QueryGroupRequest request) { var simpleFilters = request.Filters.Where(f => !(f.Token is AggregateToken)).ToList(); var aggregateFilters = request.Filters.Where(f => f.Token is AggregateToken).ToList(); var keys = request.Columns.Select(t => t.Token).Where(t => !(t is AggregateToken)).ToHashSet(); var allAggregates = request.AllTokens().OfType <AggregateToken>().ToHashSet(); DEnumerableCount <T> plainCollection = Execute(new QueryRequest { Columns = keys.Concat(allAggregates.Select(at => at.Parent).NotNull()).Distinct().Select(t => new Column(t, t.NiceName())).ToList(), Orders = new List <Order>(), Filters = simpleFilters, QueryName = request.QueryName, Pagination = new Pagination.All(), }, GetQueryDescription()); var groupCollection = plainCollection .GroupBy(keys, allAggregates) .Where(aggregateFilters) .OrderBy(request.Orders); var cols = request.Columns .Select(column => (column, Expression.Lambda(column.Token.BuildExpression(groupCollection.Context), groupCollection.Context.Parameter))).ToList(); var values = groupCollection.Collection.ToArray(); return(values.ToResultTable(cols, values.Length, new Pagination.All())); }