Union就是把不相干的一些数据实体,合并起来,一起供外部查询。不用像webapi,完成查询不同的数据,需要多次请求。一次请求,获取多样数据,减少请求次数,这也是GraphQL的优势之一。怎么弄,来来来,代码看过来:
using HotChocolate;
using HotChocolate.Execution;
using HotChocolate.Types;
using System;namespace GraphQLBase006
{class Program{static void Main(string[] args){UnionDemo.Run();}}public class UnionDemo{public static void Run(){var schema = SchemaBuilder.New().AddQueryType<Query>().AddType<Car>().AddType<Cabbage>().AddType<Earth>().AddProjections().Create();var executor = schema.MakeExecutable();Console.WriteLine(executor.Execute(@"
{formats{__typename,... on Car{brand,price},... on Cabbage{name,nutrition}... on Earth{diameter }}
}").ToJson());}}public class Query{public IUnion[] GetFormats(){return new IUnion[]{new Car{Brand="Benz",Price=1000000},new Cabbage{Name="灰子白",Nutrition="纤维"}, new Earth{Diameter=12742}};}}[UnionType("Unio")]public interface IUnion{}public class Car : IUnion{public string Brand { get; set; }public decimal Price { get; set; }}public class Cabbage : IUnion{public string Name { get; set; }public string Nutrition { get; set; }}public class Earth : IUnion{public double Diameter { get; set; } }
}
案例中就是把不相干的Car,Cabbage,Earth,通过继承一个空接口合并起来,供外部访问,通过自定义查询接口语句,达到灵活取想要的数据,比如一些数据字典的查询就很有用,不相干的一些配置,同时获取到,以备后用。
结果:
{"data": {"formats": [{"__typename": "Car","brand": "Benz","price": 1000000},{"__typename": "Cabbage","name": "\u7070\u5B50\u767D","nutrition": "\u7EA4\u7EF4"},{"__typename": "Earth","diameter": 12742}]}
}