private DQueryable <T> GetDQueryable(QueryRequest request) { if (!request.GroupResults) { request.Columns.Insert(0, new _EntityColumn(EntityColumnFactory().BuildColumnDescription(), QueryName)); return(Query .ToDQueryable(GetQueryDescription()) .SelectMany(request.Multiplications()) .Where(request.Filters) .OrderBy(request.Orders) .Select(request.Columns)); } else { 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(); DQueryable <T> query = Query .ToDQueryable(GetQueryDescription()) .SelectMany(request.Multiplications()) .Where(simpleFilters) .GroupBy(keys, allAggregates) .Where(aggregateFilters) .OrderBy(request.Orders); return(query); } }
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)); }