[英]Query dynamic schema using a JSON object - GraphQL .NET 6 PostgreSQL and HotChocolate
我需要开发一个graphql服务器直接从一个JSON object查询数据。这个JSON object存储在postgres数据库表中如下。
这个值字段可以是任何 JSON object。我无法控制它。 它直接来自 SharePoint 服务器。 我需要使用 graphql 动态查询这个 JSON object。
我这里想要的是查询JSON object,只得到我需要的,而不是得到JSON的所有数据。 例如像下面
query {
allBookings {
id,
listId
widget {
text {
name
style
onMouseUp
}
}
}
}
我正在使用的技术
到目前为止,这是我的代码。
[Table("bookings")]
public class Booking
{
[Column(name: "id")]
public int Id { get; set; }
[Column(name: "list_id")]
public Guid ListId { get; set; }
[Column(name: "value", TypeName = "jsonb")]
[GraphQLType(typeof(AnyType))]
public string Value { get; set; }
}
public class BookingType : ObjectType<Booking>
{
private readonly IDbContextFactory<DemoDBContext> _factory;
public BookingType(IDbContextFactory<DemoDBContext> factory)
{
_factory = factory;
}
[Obsolete]
protected override void Configure(IObjectTypeDescriptor<Booking> descriptor)
{
descriptor.Field(t => t.Id)
.Type<NonNullType<IntType>>();
descriptor.Field(t => t.ListId)
.Type<NonNullType<UuidType>>();
descriptor.Field(t => t.Value)
.Type<AnyType>()
.Resolver(context =>
{
var db = _factory.CreateDbContext();
var value = context.Parent<Booking>().Value;
return value;
});
}
}
public class Query
{
private readonly IDbContextFactory<DemoDBContext> _factory;
public Query(IDbContextFactory<DemoDBContext> factory)
{
_factory = factory;
}
public async Task<IEnumerable<Booking>> GetAllBookings()
{
using var context = await _factory.CreateDbContextAsync();
var bookings = await context.Bookings.ToListAsync();
return bookings;
}
public async Task<Booking> GetBooking(Guid id)
{
using var context = await _factory.CreateDbContextAsync();
var booking = await context.Bookings.Where(x => x.ListId == id).FirstOrDefaultAsync();
return booking;
}
}
我尝试过不同的方法,但我没有明确的想法来实现这种行为,甚至没有可能做到这一点。
如果有更好的方法,请建议我。 谢谢大家。
GraphQL 将自动过滤掉未请求或不属于 model 的字段。
如果您将类型定义为:
type Booking {
id: ID!
listID: String
value: Widget
}
type Widget {
text: SubWidget
}
type SubWidget {
name: String
style: String
onMouseUp: String
}
query allBookings: [Booking]
在您的解析器中,您将返回与每个Booking
对应的 JSON 个对象的数组。 如果该 JSON 具有不属于您的类型定义的字段,则不会返回它们。 如果您要求的某些字段丢失,那么它们将返回为未定义,除非您使它们不可为空(例如: name: String!
)
所以你大部分时间都在那里。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.