示例#1
0
        /// <summary>
        /// Creates a resolve function for a query that can both AND and OR conditions together
        /// </summary>
        /// <typeparam name="TModel">The type of model to create the query for</typeparam>
        /// <returns>A function that takes a graphql context and returns a list of models</returns>
        public static Func <ResolveFieldContext <object>, IQueryable <TModel> > CreateConditionalQuery <TModel>()
            where TModel : class, IOwnerAbstractModel, new()
        {
            return(context =>
            {
                // Fetch the models that we need
                var models = QueryHelpers.CreateResolveFunction <TModel>()(context);

                // Apply the conditions to the query
                models = QueryHelpers.CreateConditionalWhere(context, models);

                return models;
            });
        }
示例#2
0
        /// <summary>
        /// Creates a query that counts the number of models that comply to a set of conditions.
        /// This query can perform both AND and OR conditions.
        /// </summary>
        /// <typeparam name="TModel">The type of model to count</typeparam>
        /// <returns>A function that takes a graphql context and returns a list of models</returns>
        public static Func <ResolveFieldContext <object>, Task <object> > CreateConditionalCountQuery <TModel>()
            where TModel : class, IOwnerAbstractModel, new()
        {
            return(async context =>
            {
                // Fetch the models that we need
                var models = QueryHelpers.CreateResolveFunction <TModel>()(context);

                // Apply conditions to the query
                models = QueryHelpers.CreateConditionalWhere(context, models);
                models = QueryHelpers.CreateIdsCondition(context, models);
                models = QueryHelpers.CreateIdCondition(context, models);

                return new NumberObject {
                    Number = await models.CountAsync()
                };
            });
        }
示例#3
0
        /// <summary>
        /// Adds single, multiple and connection queries to query
        /// </summary>
        /// <typeparam name="TModelType">The GraphQL type for returning data</typeparam>
        /// <typeparam name="TModel">The EF model type for querying the DB</typeparam>
        /// <param name="name">The name of the entity</param>
        public void AddModelQueryField <TModelType, TModel>(string name)
            where TModelType : ObjectGraphType <TModel>
            where TModel : class, IOwnerAbstractModel, new()
        {
            AddQueryField(
                $"{name}s",
                QueryHelpers.CreateResolveFunction <TModel>(),
                typeof(TModelType)).Description = $"Query for fetching multiple {name}s";

            AddSingleField(
                name: name,
                resolve: QueryHelpers.CreateResolveFunction <TModel>(),
                graphType: typeof(TModelType)).Description = $"Query for fetching a single {name}";

            AddQueryConnectionField(
                $"{name}sConnection",
                QueryHelpers.CreateResolveFunction <TModel>(),
                typeof(TModelType));

            FieldAsync <NumberObjectType>(
                $"count{name}s",
                arguments: new QueryArguments(
                    new QueryArgument <IdGraphType> {
                Name = "id"
            },
                    new QueryArgument <ListGraphType <IdGraphType> > {
                Name = "ids"
            },
                    new QueryArgument <ListGraphType <WhereExpressionGraph> >
            {
                Name        = "where",
                Description = WhereDesc
            }
                    ),
                resolve: CountQuery.CreateCountQuery <TModel>(),
                description: "Counts the number of models according to a given set of conditions"
                );

            AddQueryField(
                $"{name}sConditional",
                ConditionalQuery.CreateConditionalQuery <TModel>(),
                typeof(TModelType),
                new QueryArguments(
                    new QueryArgument <ListGraphType <ListGraphType <WhereExpressionGraph> > >
            {
                Name        = "conditions",
                Description = ConditionalWhereDesc
            }
                    )
                );

            FieldAsync <NumberObjectType>(
                $"count{name}sConditional",
                arguments: new QueryArguments(
                    new QueryArgument <IdGraphType> {
                Name = "id"
            },
                    new QueryArgument <ListGraphType <IdGraphType> > {
                Name = "ids"
            },
                    new QueryArgument <ListGraphType <ListGraphType <WhereExpressionGraph> > >
            {
                Name        = "conditions",
                Description = ConditionalWhereDesc
            }
                    ),
                resolve: CountQuery.CreateConditionalCountQuery <TModel>(),
                description: "Counts the number of models according to a given set of conditions. This query can " +
                "perform both AND and OR conditions"
                );
        }