【问题标题】:C# flatten a list of objectsC# 展平对象列表
【发布时间】:2022-07-21 16:35:11
【问题描述】:

给定以下对象:

public class Order
{
    public int OrderID { get; set; }
    public int TotalPrice { get; set; }
    public List<OrderItem> Items { get; set; }
}

public class OrderItem
{
    public string Name { get; set; }
    public int Price { get; set; }
    public string SKU { get; set; }
}

现在我有这个结构:

[
    {
        "order_id": 1,
        "total_price": 700,
        "items": [
            {
                "name": "cellphone",
                "price": 500,
                "sku": "1s4f"
            },
            {
                "product_name": "airphones",
                "product_price": 200,
                "sku": "1ar4"
            }
        ]
    },
    {
        "order_id": 2,
        "total_price": 5000,
        "products_info": [
            {
                "name": "car",
                "price": 2500,
                "sku": "8y5t"
            },
            {
                "name": "battery",
                "price": 1500,
                "sku": "5g3g"
            },
            {
                "name": "insurance",
                "price": 1000
                "sku": "5r8f"
            }
        ]
    }
]

我想将第一个订单拆分为 2 个订单,每个订单包含一个项目,第二个订单拆分为 3 个订单,逻辑相同。 这样做的最佳清洁和可读方式是什么?

【问题讨论】:

  • 所以您希望第一个商品是 2 个订单,具有相同的 Id,但只有一个商品?

标签: c# .net


【解决方案1】:

如果有 IEnumerable&lt;Order&gt;,您可以使用 LINQ Select 和 SelectMany

var result = orders.SelectMany(o => o.Items.Select(i => new Order{
   OrderID = o.OrderID,
   TotalPrice = i.Price,
   Items = new List<OrderItem> {
        new() { Name = i.Name, Price = i.Price, SKU = i.SKU }
   }
});

这会将您的商品拼合为 5 个单独的订单,每个订单包含一个商品。我假设您希望订单 TotalPrice 与它下面的单件商品的价格相匹配。

【讨论】:

    【解决方案2】:

    你可以做的是改变 OrderItem 并在里面放一个外键

        public class OrderItem
    {
        public string Name { get; set; }
        public int Price { get; set; }
        public string SKU { get; set; }
        public int OrderId { get; set; }
        public Order Order { get; set; }
    }
    

    然后查询 像这样var Items=_context.OrderItem.Tolist();

    【讨论】:

      猜你喜欢
      • 2017-05-22
      • 2019-12-15
      • 2015-02-03
      • 1970-01-01
      • 2023-02-08
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 2017-07-02
      相关资源
      最近更新 更多