【问题标题】:How to get two fields with the same Id如何获取具有相同 ID 的两个字段
【发布时间】:2020-05-19 04:29:28
【问题描述】:

我需要在 Altair(GraphQl) 中发送两个具有相同 ID 的字段。

mutation{
  createGoodsOrder(goodsorder: {
    deliveryDate: "2019-10-10"
    goodsOrderItems: [
      { orderItemId: 54 quantity: 1 costPerUnit: 1 goodType: INGREDIENT }
      { orderItemId: 54 quantity: 2 costPerUnit: 2 goodType: INGREDIENT }
    #  { orderItemId: 58 quantity: 2 costPerUnit: 2 goodType: INGREDIENT }
    ]
  }){
    id
  }
}

当我执行突变时,模型包含两个具有相同 ID 的字段,但是当我创建 Fetch 时,它只返回第一个。如果不相同,则 Fetch 返回两个字段。如何获取具有相同 ID 的两个字段?

var orderIngredients = _repository.Fetch<Ingredient>(e => model.GoodsOrderItems.Any(g => g.OrderItemId == e.Id)).ToList();

var orderIngredients = _repository.Fetch<Ingredient>(
                                        e => e.IngredientType.PlaceId == model.PlaceId
                                          && model.GoodsOrderItems.Any(g => g.OrderItemId == e.Id && g.GoodType == GoodsTypes.Ingredient))
                                        .Select(e => new GoodsOrderIngredientCreateModel
                                        {
                                            IngredientId = e.Id,
                                            Quantity = model.GoodsOrderItems.First(i => i.OrderItemId == e.Id).Quantity,
                                            CostPerUnit = model.GoodsOrderItems.First(i => i.OrderItemId == e.Id).CostPerUnit,
                                            TotalPrice = model.GoodsOrderItems.First(i => i.OrderItemId == e.Id).Quantity * 
                                                         model.GoodsOrderItems.First(i => i.OrderItemId == e.Id).CostPerUnit,
                                            GoodType = GoodsTypes.Ingredient
                                        }).Select(v => new GoodsOrderIngredient 
                                        {
                                            Id = v.Id,
                                            IngredientId = v.IngredientId,
                                            Quantity = v.Quantity,
                                            CostPerUnit = v.CostPerUnit,
                                            TotalPrice = v.TotalPrice
                                        }).ToList();

变异:

mutation.Field<GoodsOrderType>(
                name: "createGoodsOrder",
                arguments: new QueryArguments(
                    new QueryArgument<NonNullGraphType<GoodsOrderCreateInput>> { Name = nameof(GoodsOrder).ToLower() }
                ),
                resolve: context =>
                {
                    if (context.UserContext is GraphQLUserScopedContext userContext)
                    {
                        var goodsOrderService = userContext.ServiceScope.ServiceProvider.GetRequiredService<IVendorService>();

                        var model = context.GetArgument<GoodsOrderCreateModel>(nameof(GoodsOrder).ToLower());
                        model.PlaceId = userContext.User.PlaceId;
                        model.NetworkId = userContext.User.NetworkId;

                        var goodsOrder = goodsOrderService.CreateGoodsOrder(model);
                        return goodsOrder;
                    }
                    else
                        throw new ExecutionError(Constants.ErrorCodes.WrongUserContext);
                }).RequireAuthorization(PermissionsRequirement
                                                   .CreateForPermissionSetAll(
                                                       new Dictionary<NetworkPermissions, PermissionLevels>
                                                           { {NetworkPermissions.ERP_Cumulative, PermissionLevels.EditCreate} }));

【问题讨论】:

  • id 不应该是唯一的吗?
  • @Tvde1 不,您可以创建两个苹果订单:5 个好苹果 20 美元,3 个坏苹果 5 美元
  • 截图中的代码大量使用了First()。也许这就是问题所在?
  • @ThomasWeller 这不是因为First,因为我在问题中提供的代码示例中得到了相同的结果。示例:在Ingredient 表中,我有 2 个 ID 为 54 和 58 的成分。当在 GraphQl 中我发送两个相同的成分 ID 时,Fetch 在调试模式下返回一个字段。如果不一样,则返回两个字段

标签: c# .net linq graphql


【解决方案1】:

我不懂 c# 但可能你不需要中间类型

                                  var orderIngredients = _repository.Fetch<Ingredient>(
                                    e => e.IngredientType.PlaceId == model.PlaceId
                                      && model.GoodsOrderItems.Any(g => g.OrderItemId == e.Id && g.GoodType == GoodsTypes.Ingredient))
                                    .Select(v => new GoodsOrderIngredient 
                                    {
                                        Id = v.Id,
                                        IngredientId = v.IngredientId,
                                        Quantity = v.Quantity,
                                        CostPerUnit = v.CostPerUnit,
                                        TotalPrice = v.Quantity * v.CostPerUnit
                                    }).ToList();

PS。如果GoodsOrderIngredientCreateModel(用于创建突变?)包含TotalPrice,那么总计算已经在数据库中了?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    相关资源
    最近更新 更多