Example #1
0
        private static ArgumentDefinition ConfigureArgumentName(
            this ArgumentDefinition definition)
        {
            ILazyTypeConfiguration lazyArgumentConfiguration =
                LazyTypeConfigurationBuilder
                .New <ArgumentDefinition>()
                .Definition(definition)
                .Configure((context, definition) =>
            {
                IFilterConvention convention =
                    context.DescriptorContext.GetFilterConvention();
                definition.Name = convention.GetArgumentName();
            })
                .On(ApplyConfigurationOn.Completion)
                .Build();

            definition.Configurations.Add(lazyArgumentConfiguration);
            return(definition);
        }
Example #2
0
        public Expression HandleLeave(
            SelectionVisitorContext context,
            IFieldSelection selection,
            Expression expression)
        {
            IFilterConvention convention   = context.SelectionContext.FilterConvention;
            NameString        argumentName = convention.GetArgumentName();

            if (context.TryGetValueNode(argumentName, out IValueNode? filter) &&
                selection.Field.Arguments[argumentName].Type is InputObjectType iot &&
                iot is IFilterInputType fit &&
                convention.TryGetVisitorDefinition(
                    out FilterExpressionVisitorDefinition? defintion))
            {
                var visitorContext = new QueryableFilterVisitorContext(
                    iot,
                    fit.EntityType,
                    defintion,
                    context.Conversion,
                    false);

                QueryableFilterVisitor.Default.Visit(filter, visitorContext);

                if (visitorContext.TryCreateLambda(
                        out LambdaExpression? filterExpression))
                {
                    return(Expression.Call(
                               typeof(Enumerable),
                               nameof(Enumerable.Where),
                               new[] { fit.EntityType },
                               expression,
                               filterExpression));
                }
                else
                {
                    context.ReportErrors(visitorContext.Errors);
                }
            }

            return(expression);
        }