以下のようにコードを設定しています (.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 つのクエリが起動されていることがわかります
- Order テーブルの親データをロードするには
- dataLoader で注文明細を読み込むには