Build Graphql variable
I can't figure out how to build graphql variable object properly, the error is mainly that the graphQL server wants everything in camel case, but json serilizing for some properties is captilized and follows C# naming conventions.
` var filterV2 = new ObjectValueFilter { DefinitionId= 37};
var dic = new Dictionary<string, object>
{
{ nameof(filterV2), filterV2 }
};
var filterParameter2 = new GraphQlQueryParameter<ObjectValueFilter>(nameof(filterV2));
var queryBuilder = new QueryQueryBuilder()
.WithObjectValues(new ObjectValueConnectionQueryBuilder()
.WithPageInfo(new PageInfoQueryBuilder()
.WithHasNextPage())
.WithEdges(new ObjectValueEdgeQueryBuilder()
.WithCursor()
.WithNode(new ObjectValueQueryBuilder()
.WithDbId()
.WithOwnerDbId()
.WithCode()
.WithDescription()
))
, first: 100, after: "1", filter: filterParameter2).WithParameter(filterParameter2);
var gql = new GraphQLRequest
{
Query = queryBuilder.Build(Formatting.Indented),
Variables = dic
};
Console.WriteLine($"Query:{JsonConvert.SerializeObject(gql, Settings)}");`
the serilized GraphQLRequest is: { "query": "query (\r\n $filterV2: ObjectValue_Filter) {\r\n objectValues(first: 100, after: \"1\", filter: $filterV2) {\r\n pageInfo {\r\n hasNextPage\r\n }\r\n edges {\r\n cursor\r\n node {\r\n dbId\r\n ownerDbId\r\n code\r\n description\r\n }\r\n }\r\n }\r\n}", "variables": { "filterV2": { "DefinitionId": 37 } } }
DefinitionId should have been definitionId
If I try
var queryBuilder = new QueryQueryBuilder() .WithObjectValues(new ObjectValueConnectionQueryBuilder() .WithPageInfo(new PageInfoQueryBuilder() .WithHasNextPage()) .WithEdges(new ObjectValueEdgeQueryBuilder() .WithCursor() .WithNode(new ObjectValueQueryBuilder() .WithDbId() .WithOwnerDbId() .WithCode() .WithDescription() )) , first: 100, after: "1", filter: filterV2);
then filter is correct with definitionId as shown bellow.
query{objectValues(first:100,after:"1",filter:{definitionId:37}){pageInfo{hasNextPage},edges{cursor,node{dbId,ownerDbId,code,description}}}}
Is there anything I do wrong or that I miss? I realy like the query builder and want to start
to use this in our code.
Other observation: From the definition of ObjectValueFilter we have this: `#if !GRAPHQL_GENERATOR_DISABLE_NEWTONSOFT_JSON [JsonConverter(typeof(QueryBuilderParameterConverter<int?>))] #endif public QueryBuilderParameter<int?> DefinitionId { get { return (QueryBuilderParameter<int?>)_definitionId.Value; } set { _definitionId = new InputPropertyInfo { Name = "definitionId", Value = value }; } }
#if !GRAPHQL_GENERATOR_DISABLE_NEWTONSOFT_JSON
[JsonProperty("definitionId_not")]
[JsonConverter(typeof(QueryBuilderParameterConverter<int?>))]
#endif
public QueryBuilderParameter<int?> DefinitionIdNot
{
get { return (QueryBuilderParameter<int?>)_definitionIdNot.Value; }
set { _definitionIdNot = new InputPropertyInfo { Name = "definitionId_not", Value = value }; }
}`
DefinitionId don't have a JsonProperty, but e.g. definitionId_not has one. I belive this could also solve the proble
PS: The exemple above s a simple and it could be solved easily without variables directly in the query, so this is more a test of functionality. We do mutation we sometimes send a list of 100 input objects in one request. We then think it is easier to read and better practice when the input is in the varable object and not a part of the query string.
Which type is ObjectValueFilter? Is that regular generated data class? If yes, by default they are generated for mapping the responses and both NewtonSoft and System.Text.Json can map camel case fields to .NET properties. You can enforce JsonProperty attribute generation by setting JsonPropertyGeneration configuration property to JsonPropertyGenerationOption.CaseSensitive or JsonPropertyGenerationOption.Always.
Great! Thanks that solved the problem