[英]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.