0

以下のようにコードを設定しています (.AddProjection() は既に Startup.cs ファイルに追加されています)。

[UseApplicationDbContext]
[UsePaging(MaxPageSize = 1000)]
[UseProjection]
[UseFiltering]
[UseSorting]
public async Task<IQueryable<Order>> GetOrders(
        [ScopedService] MyDbContext context
        , [Service] IOrderRepo _repository)
{
    return await _repository.GetOrders(context);
}

public class Order {
    ... Some properties

    public OrderDetail Detail {get;set;}
}

 public class OrderType : ObjectType<Order>
{
    protected override void Configure(IObjectTypeDescriptor<Order> descriptor)
    {
        descriptor.Field(x => x.OrderId).IsProjected(true);

        descriptor.Field(e => e.Details)
            .IsProjected(false)
            .ResolveWith<OrderDetailResolvers>(er => er.GetOrderDetailAsync(default!, default!, default));
    }
}        

private class OrderDetailResolvers
{
    public async Task<OrderDetail?> GetOrderDetailAsync(
        Order order,
        OrderDetailByIdDataLoader dataLoader,
        CancellationToken cancellationToken)
    {
        if (order.OrderId is null)
        {
            return null;
        }

        return await dataLoader.LoadAsync(order.OrderId, cancellationToken);
    }
}

このようにクエリすると:

query {
    orders
    {
        edges {
          node {
              orderId
              detail {
                  orderId
                  productId
                  ...
              }
          }
        }
    }
}

以下の結果が得られます:

"data": {
    "orders": {
      "edges": [
        {
          "node": {
            "orderId": "10000458",            
            "detail": {}
          }
        },
        ... and so on all the data
      ]
    }
}

問題は、ネストされた注文詳細データがクエリ結果に表示されないことです (データ ローダーが同じクエリを実行しても)。

2 つのクエリが起動されていることがわかります

  1. Order テーブルの親データをロードするには
  2. dataLoader で注文明細を読み込むには
4

1 に答える 1