public async Task <object> Resolve(FederatedResolveContext context)
 {
     return(await _resolver(context));
 }
 public async Task <object> Resolve(FederatedResolveContext context)
 {
     return(await _resolver(context).ConfigureAwait(false));
 }
        private void AddRootEntityFields(ISchema schema)
        {
            var query = schema.Query;

            if (query == null)
            {
                schema.Query = query = new ObjectGraphType {
                    Name = "Query"
                };
            }

            query.Field("_service", new NonNullGraphType(new GraphQLTypeReference("_Service")), resolve: context => new {});

            var representationsType = new NonNullGraphType(new ListGraphType(new NonNullGraphType(new GraphQLTypeReference("_Any"))));

            query.FieldAsync(
                "_entities",
                new NonNullGraphType(new ListGraphType(new GraphQLTypeReference("_Entity"))),
                arguments: new QueryArguments(new QueryArgument(representationsType)
            {
                Name = "representations"
            }),
                resolve: async context =>
            {
                AddTypeNameToSelection(context.FieldAst, context.Document);

                var reps = context.GetArgument <List <Dictionary <string, object> > >("representations");

                var results = new List <object>();

                foreach (var rep in reps)
                {
                    var typeName = rep["__typename"].ToString();
                    var type     = context.Schema.FindType(typeName);
                    if (type != null)
                    {
                        // execute resolver
                        var resolver = type.GetMetadata <IFederatedResolver>(ResolverMetadataField);
                        if (resolver != null)
                        {
                            var resolveContext = new FederatedResolveContext
                            {
                                Arguments          = rep,
                                ParentFieldContext = context
                            };
                            var result = await resolver.Resolve(resolveContext).ConfigureAwait(false);
                            results.Add(result);
                        }
                        else
                        {
                            results.Add(rep);
                        }
                    }
                    else
                    {
                        // otherwise return the representation
                        results.Add(rep);
                    }
                }

                return(results);
            });
        }