使用投影不会加载用数据加载器解析的字段

问题描述

我的代码设置如下(.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加载订单详情

解决方法

您好@adesh 不幸的是,UseSelection 不能很好地与数据加载器配合使用。您无法选择已解析的数据。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...