簡體   English   中英

使用 JSON object - GraphQL .NET 6 PostgreSQL 和 HotChocolate 查詢動態模式

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

目前,我的結果是這樣的。 在此處輸入圖像描述

我正在使用的技術

  • .NET 6
  • Postgresql
  • 熱可可

到目前為止,這是我的代碼。

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM