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);
        }
 private static Expression <Func <TModel, object> >[] GetIncludes <TModel>(SelectExpandDefinition selectExpandDefinition) where TModel : class
 => selectExpandDefinition.GetExpansionSelectors <TModel>().ToArray() ?? new Expression <Func <TModel, object> >[]
 {
 };