Пример #1
0
        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);
            }
        }
Пример #2
0
        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));
        }