protected IRequestExecutor CreateSchema <TEntity, T>( TEntity[] entities, FilterConvention?convention = null, bool withPaging = false, Action <ISchemaBuilder>?configure = null) where TEntity : class where T : FilterInputType <TEntity> { convention ??= new FilterConvention(x => x.AddDefaults().BindRuntimeType <TEntity, T>()); Func <IResolverContext, IEnumerable <TEntity> > resolver = BuildResolver(entities); ISchemaBuilder builder = SchemaBuilder.New() .AddConvention <IFilterConvention>(convention) .AddFiltering() .AddQueryType( c => { IObjectFieldDescriptor field = c .Name("Query") .Field("root") .Resolve(resolver); if (withPaging) { field.UsePaging <ObjectType <TEntity> >(); } field.UseFiltering <T>(); field = c .Name("Query") .Field("rootExecutable") .Resolve(ctx => resolver(ctx).AsExecutable()); if (withPaging) { field.UsePaging <ObjectType <TEntity> >(); } field.UseFiltering <T>(); }); configure?.Invoke(builder); ISchema schema = builder.Create(); return(schema.MakeExecutable()); }
private void ApplyConfigurationToField <TEntity, TType>( IObjectFieldDescriptor field, bool withPaging) where TEntity : class where TType : FilterInputType <TEntity> { field.Use( next => async context => { await next(context); if (context.Result is IQueryable <TEntity> queryable) { try { context.ContextData["sql"] = queryable.ToQueryString(); } catch (Exception) { context.ContextData["sql"] = "EF Core 3.1 does not support ToQueryString"; } } }); if (withPaging) { field.UsePaging <ObjectType <TEntity> >(); } field.UseFiltering <TType>(); }
public override void OnConfigure(IObjectFieldDescriptor descriptor) { if (FilterType is null) { descriptor.UseFiltering(); } else { _generic.MakeGenericMethod(FilterType).Invoke(null, new[] { descriptor }); } }
public override void OnConfigure( IDescriptorContext context, IObjectFieldDescriptor descriptor, MemberInfo member) { if (Type is null) { descriptor.UseFiltering(Scope); } else { _generic.MakeGenericMethod(Type).Invoke( null, new object?[] { descriptor, Scope }); } }
protected IRequestExecutor CreateSchema <TEntity, T>( TEntity[] entities, FilterConvention?convention = null, bool withPaging = false) where TEntity : class where T : FilterInputType <TEntity> { convention ??= new FilterConvention(x => x.AddDefaults().BindRuntimeType <TEntity, T>()); Func <IResolverContext, IEnumerable <TEntity> >?resolver = BuildResolver(entities); ISchemaBuilder builder = SchemaBuilder.New() .AddConvention <IFilterConvention>(convention) .AddFiltering() .AddQueryType( c => { IObjectFieldDescriptor field = c .Name("Query") .Field("root") .Resolver(resolver) .Use( next => async context => { await next(context); if (context.Result is IQueryable <TEntity> queryable) { try { context.ContextData["sql"] = queryable.ToQueryString(); } catch (Exception) { context.ContextData["sql"] = "EF Core 3.1 does not support ToQueryString"; } } }); if (withPaging) { field.UsePaging <ObjectType <TEntity> >(); } field.UseFiltering <T>(); }); ISchema schema = builder.Create(); return(new ServiceCollection() .Configure <RequestExecutorFactoryOptions>( Schema.DefaultName, o => o.Schema = schema) .AddGraphQL() .UseRequest( next => async context => { await next(context); if (context.Result is IReadOnlyQueryResult result && context.ContextData.TryGetValue("sql", out var queryString)) { context.Result = QueryResultBuilder .FromResult(result) .SetContextData("sql", queryString) .Create(); } }) .UseDefaultPipeline() .Services .BuildServiceProvider() .GetRequiredService <IRequestExecutorResolver>() .GetRequestExecutorAsync() .Result); }