/// <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; }); }
/// <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() }; }); }
/// <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" ); }