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>();
        }
Beispiel #3
0
 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 });
     }
 }
Beispiel #5
0
        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);
        }