internal static async Task <ICollection <TModel> > GetAsync <TModel, TData>(this IStore store, IMapper mapper,
                                                                                    Expression <Func <TModel, bool> > filter = null,
                                                                                    Expression <Func <IQueryable <TModel>, IQueryable <TModel> > > queryFunc = null,
                                                                                    SelectExpandDefinition selectExpandDefinition = null)
            where TModel : BaseModel
            where TData : BaseData
        {
            return(mapper.ProjectTo
                   (
                       await store.GetQueryableAsync
                       (
                           Getfilter(),
                           GetQueryFunc()
                       ),
                       null,
                       GetIncludes()
                   )
                   .UpdateQueryable(selectExpandDefinition.GetExpansions(typeof(TModel)), mapper)
                   .ToList());

            Expression <Func <TModel, object> >[] GetIncludes()
            => selectExpandDefinition?.GetExpansionSelectors <TModel>().ToArray() ?? new Expression <Func <TModel, object> >[]
            {
            };

            Func <IQueryable <TData>, IQueryable <TData> > GetQueryFunc()
            => mapper.MapExpression <Expression <Func <IQueryable <TData>, IQueryable <TData> > > >(queryFunc)?.Compile();

            Expression <Func <TData, bool> > Getfilter()
            => mapper.MapExpression <Expression <Func <TData, bool> > >(filter);
        }
 public void ShouldNotThrowifExpandedMemberIsLiteral()
 {
     var expression = new SelectExpandDefinition
     {
         ExpandedItems = new List <SelectExpandItem>
         {
             new SelectExpandItem
             {
                 MemberName = "Name"
             }
         }
     }.GetExpansionSelectors <Department>();
 }
 public async Task <ICollection <TModel> > GetAsync <TModel, TData>(Expression <Func <TModel, bool> > filter = null, Expression <Func <IQueryable <TModel>, IQueryable <TModel> > > queryFunc = null, SelectExpandDefinition selectExpandDefinition = null)
     where TModel : BaseModel
     where TData : BaseData
 {
     return(await _store.GetAsync <TModel, TData>
            (
                _mapper,
                filter,
                queryFunc,
                selectExpandDefinition
            ));
 }
        internal static async Task <TReturn> QueryAsync <TModel, TData, TModelReturn, TDataReturn, TReturn>(this IStore store, IMapper mapper,
                                                                                                            Expression <Func <IQueryable <TModel>, TModelReturn> > queryFunc = null,
                                                                                                            ICollection <Expression <Func <IQueryable <TModel>, IIncludableQueryable <TModel, object> > > > includeProperties = null,
                                                                                                            SelectExpandDefinition selectExpandDefinition = null)
            where TModel : BaseModel
            where TData : BaseData
        {
            //Map the expressions
            Expression <Func <IQueryable <TData>, TDataReturn> > mappedQueryFunc = mapper.MapExpression <Expression <Func <IQueryable <TData>, TDataReturn> > >(queryFunc);
            ICollection <Expression <Func <IQueryable <TData>, IIncludableQueryable <TData, object> > > > includes = mapper.MapIncludesList <Expression <Func <IQueryable <TData>, IIncludableQueryable <TData, object> > > >(includeProperties);

            //Call the store
            TDataReturn result = await store.QueryAsync(mappedQueryFunc?.Compile(),
                                                        includes?.Select(i => i.Compile()).ToList());

            if (typeof(TReturn) == typeof(TDataReturn))
            {
                return((TReturn)(object)result);
            }

            if (typeof(TReturn).IsIQueryable() && typeof(TDataReturn).IsIQueryable())
            {
                return(GetProjection(typeof(TReturn).GetUnderlyingElementType()));
            }

            return(mapper.Map <TDataReturn, TReturn>(result));

            TReturn GetProjection(Type elementType)
            => (TReturn)mapper.ProjectTo
            (
                (IQueryable)result,
                elementType,
                selectExpandDefinition
            )
            .UpdateQueryable(elementType, selectExpandDefinition.GetExpansions(elementType), mapper);
        }
 private static Expression <Func <TModel, object> >[] GetIncludes <TModel>(SelectExpandDefinition selectExpandDefinition) where TModel : class
 => selectExpandDefinition.GetExpansionSelectors <TModel>().ToArray() ?? new Expression <Func <TModel, object> >[]
 {
 };
 public static async Task <TModelReturn> QueryAsync <TModel, TData, TModelReturn>(this IStore store, IMapper mapper,
                                                                                  Expression <Func <IQueryable <TModel>, TModelReturn> > queryFunc,
                                                                                  ICollection <Expression <Func <IQueryable <TModel>, IIncludableQueryable <TModel, object> > > > includeProperties = null,
                                                                                  SelectExpandDefinition selectExpandDefinition = null)
     where TModel : BaseModel
     where TData : BaseData
 => await store.QueryAsync <TModel, TData, TModelReturn, TModelReturn, TModelReturn>(mapper, queryFunc, includeProperties, selectExpandDefinition);
 private static IQueryable <TDest> _ProjectTo <TDest>(IMapper mapper, IQueryable source, SelectExpandDefinition selectExpandDefinition = null) where TDest : class
 => mapper.ProjectTo <TDest>(source, null, GetIncludes <TDest>(selectExpandDefinition));
 public static IQueryable ProjectTo(this IMapper mapper, IQueryable source, Type destType, SelectExpandDefinition selectExpandDefinition = null)
 => (IQueryable)"_ProjectTo".GetGenericMethodInfo().MakeGenericMethod
 (
     destType
 ).Invoke(null, new object[] { mapper, source, selectExpandDefinition });
 private async static Task <TModel> QueryEntity <TModel, TData>(IContextRepository repository,
                                                                IExpressionPart filterExpression, SelectExpandDefinition selectExpandDefinition = null)
     where TModel : BaseModel
     where TData : BaseData
 => (
     await repository.GetAsync <TModel, TData>
     (
         (Expression <Func <TModel, bool> >)filterExpression.Build(),
         null,
         selectExpandDefinition
     )
     ).FirstOrDefault();
 private static Task <TModelReturn> Query <TModel, TData, TModelReturn, TDataReturn>(IContextRepository repository,
                                                                                     IExpressionPart queryExpression,
                                                                                     SelectExpandDefinition selectExpandDefinition = null)
     where TModel : BaseModel
     where TData : BaseData
 => repository.QueryAsync <TModel, TData, TModelReturn, TDataReturn>
 (
     (Expression <Func <IQueryable <TModel>, TModelReturn> >)queryExpression.Build(),
     selectExpandDefinition
 );
        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)
            });
        }
 /// <summary>
 /// Get DataSource Result
 /// </summary>
 /// <typeparam name="TModel"></typeparam>
 /// <typeparam name="TData"></typeparam>
 /// <param name="request"></param>
 /// <param name="contextRepository"></param>
 /// <param name="selectExpandDefinition"></param>
 /// <param name="includeProperties"></param>
 /// <returns></returns>
 public static async Task <DataSourceResult> GetDataSourceResult <TModel, TData>(this DataSourceRequest request, IContextRepository contextRepository, SelectExpandDefinition selectExpandDefinition = null, ICollection <Expression <Func <IQueryable <TModel>, IIncludableQueryable <TModel, object> > > > includeProperties = null)
     where TModel : BaseModel
     where TData : BaseData
 => request.Groups != null && request.Groups.Count > 0
         ? await request.GetGroupedDataSourceResult <TModel, TData>(contextRepository, request.Aggregates != null && request.Aggregates.Count > 0, selectExpandDefinition, includeProperties)
 : await request.GetUngroupedDataSourceResult <TModel, TData>(contextRepository, request.Aggregates != null && request.Aggregates.Count > 0, selectExpandDefinition);
示例#13
0
 public async Task <TReturn> QueryAsync <TModel, TData, TModelReturn, TDataReturn, TReturn>(Expression <Func <IQueryable <TModel>, TModelReturn> > queryFunc, SelectExpandDefinition selectExpandDefinition   = null,
                                                                                            ICollection <Expression <Func <IQueryable <TModel>, IIncludableQueryable <TModel, object> > > > includeProperties = null)
     where TModel : BaseModel
     where TData : BaseData
 {
     return(await _store.QueryAsync <TModel, TData, TModelReturn, TDataReturn, TReturn>(
                _mapper,
                queryFunc,
                includeProperties,
                selectExpandDefinition));
 }