Exemple #1
0
        public static IDictionary <string, object> Execute <TArgs, TEntity>(GraphQLSchema <TContext> schema, GraphQLQuery <TContext, TArgs, TEntity> gqlQuery, Query query)
        {
            var context = schema.ContextCreator();
            var results = Execute(context, gqlQuery, query);

            (context as IDisposable)?.Dispose();
            return(results);
        }
Exemple #2
0
        public static IDictionary <string, object> Execute <TArgs, TEntity>(TContext context, GraphQLQuery <TContext, TArgs, TEntity> gqlQuery, Query query)
        {
            var args = TypeHelpers.GetArgs <TArgs>(query.Inputs);
            var queryableFuncExpr = gqlQuery.QueryableExprGetter(args);
            var replaced          = (Expression <Func <TContext, IQueryable <TEntity> > >)ParameterReplacer.Replace(queryableFuncExpr, queryableFuncExpr.Parameters[0], GraphQLSchema <TContext> .DbParam);
            var fieldMaps         = query.Fields.Select(f => MapField(f, gqlQuery.Type)).ToList();
            var selector          = GetSelector <TEntity>(fieldMaps);

            var selectorExpr = Expression.Quote(selector);
            var call         = Expression.Call(typeof(Queryable), "Select", new[] { typeof(TEntity), typeof(GQLQueryObject20) }, replaced.Body, selectorExpr);
            var expr         = (Expression <Func <TContext, IQueryable <GQLQueryObject20> > >)Expression.Lambda(call, GraphQLSchema <TContext> .DbParam);
            var transformed  = expr.Compile()(context);

            object results;

            switch (gqlQuery.ResolutionType)
            {
            case ResolutionType.Unmodified:
                throw new Exception("Queries cannot have unmodified resolution. May change in the future.");

            case ResolutionType.ToList:
                results = transformed.ToList().Select(o => MapResults(o, fieldMaps));
                break;

            case ResolutionType.FirstOrDefault:
                results = MapResults(transformed.FirstOrDefault(), fieldMaps);
                break;

            case ResolutionType.First:
                results = MapResults(transformed.First(), fieldMaps);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            return(new Dictionary <string, object> {
                { "data", results }
            });
        }