private static DataSourceResult GetUngroupedDataSourceResult <TModel, TData>(this DataSourceRequest request, IQueryable <TData> query, IMapper mapper, bool getAggregates, ICollection <Expression <Func <IQueryable <TModel>, IIncludableQueryable <TModel, object> > > > includeProperties = null)
            where TModel : BaseModel
            where TData : BaseData
        {
            Expression <Func <IQueryable <TModel>, AggregateFunctionsGroup> > aggregatesExp = getAggregates ? QueryableExtensionsEx.CreateAggregatesExpression <TModel>(request) : null;
            Expression <Func <IQueryable <TModel>, int> > totalExp = QueryableExtensionsEx.CreateTotalExpression <TModel>(request);
            Expression <Func <IQueryable <TModel>, IEnumerable <TModel> > > ungroupedExp = QueryableExtensionsEx.CreateUngroupedDataExpression <TModel>(request);

            return(new DataSourceResult
            {
                Data = query.Query <TModel, TData, IEnumerable <TModel>, IEnumerable <TData> >(mapper, ungroupedExp, includeProperties),
                AggregateResults = getAggregates
                                    ? query.Query <TModel, TData, AggregateFunctionsGroup, AggregateFunctionsGroup, AggregateFunctionsGroupModel <TModel> >(mapper, aggregatesExp, includeProperties)
                                   ?.GetAggregateResults(request.Aggregates.SelectMany(a => a.Aggregates))
                                    : null,
                Total = query.Query <TModel, TData, int, int>(mapper, totalExp, includeProperties)
            });
        }
        private static async Task <DataSourceResult> GetGroupedDataSourceResult <TModel, TData>(this DataSourceRequest request, IContextRepository contextRepository, bool getAggregates, SelectExpandDefinition selectExpandDefinition = null, ICollection <Expression <Func <IQueryable <TModel>, IIncludableQueryable <TModel, object> > > > includeProperties = null)
            where TModel : BaseModel
            where TData : BaseData
        {
            Expression <Func <IQueryable <TModel>, AggregateFunctionsGroup> > aggregatesExp = getAggregates ? QueryableExtensionsEx.CreateAggregatesExpression <TModel>(request) : null;
            Expression <Func <IQueryable <TModel>, int> > totalExp = QueryableExtensionsEx.CreateTotalExpression <TModel>(request);
            Expression <Func <IQueryable <TModel>, IEnumerable <AggregateFunctionsGroup> > > groupedExp = QueryableExtensionsEx.CreateGroupedDataExpression <TModel>(request);

            return(new DataSourceResult
            {
                Data = await contextRepository.QueryAsync <TModel, TData, IEnumerable <AggregateFunctionsGroup>, IEnumerable <AggregateFunctionsGroup>, IEnumerable <AggregateFunctionsGroupModel <TModel> > >(groupedExp, selectExpandDefinition, includeProperties),
                AggregateResults = getAggregates
                                    ? (await contextRepository.QueryAsync <TModel, TData, AggregateFunctionsGroup, AggregateFunctionsGroup, AggregateFunctionsGroupModel <TModel> >(aggregatesExp, selectExpandDefinition))
                                   ?.GetAggregateResults(request.Aggregates.SelectMany(a => a.Aggregates))
                                    : null,
                Total = await contextRepository.QueryAsync <TModel, TData, int, int>(totalExp, selectExpandDefinition)
            });
        }