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); }
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 } }); }