0

抱歉这个不清楚的标题,但我不知道如何命名。显示它会更容易:

对象示例:

class Order
  {
     public string OrderNumber{ get; set; }
     public IEnumerable<ProductWithQuantity> ProductsWithQuantities{ get; set; }
  }

class ProductWithQuantity
  {
     public string ProductName{ get; set; }
     public int Quantity{ get; set; }
  }

可以说我有IEnumerable<Order>,每个订单都有产品清单和数量。订单总是有相同的产品列表,只是数量不同。现在它都是按订单分组的,如何反转它以按产品分组。

为了更好地可视化它,我将展示我想要在伪 json 上实现的目标。

当前生成的json:

[
    {
        OrderNumber,
        ProductsWithQuantities [
            {ProductName, Quantity}
        ]
    }
]

我想实现这样的目标:

[
    {
        ProductName,
        OrdersWithQuantities [
            {OrderNumber, Quantity}
        ]
    }
]

我尝试使用 select 和 group by 但我无法解决。

4

1 回答 1

1

1 - 通过考虑以下测试集合:

List<Order> orders = new List<Order>
{
    new Order
    {
        OrderNumber = "o1",
        ProductsWithQuantities = new List<ProductWithQuantity>
        {
            new ProductWithQuantity{ProductName = "p1", Quantity=1},
            new ProductWithQuantity{ProductName = "p2", Quantity=2},
        }
    },
    new Order
    {
        OrderNumber = "o2",
        ProductsWithQuantities = new List<ProductWithQuantity>
        {
            new ProductWithQuantity{ProductName = "p1", Quantity=1},
            new ProductWithQuantity{ProductName = "p2", Quantity=2},
        }
    }
};

2 - 您可以SelectManay用来压平所有产品。并ProductName通过构建新集合进行分组,如以下代码:

var result = orders
    .SelectMany(x => x.ProductsWithQuantities.Select(y => new { x.OrderNumber, y.ProductName, y.Quantity }))
    .GroupBy(p => p.ProductName)
    .Select(x => new 
        { 
            ProductName = x.Key, 
            OrderWithQuantities = x.Select(y => new { OrderNumer = y.OrderNumber, Quantity = y.Quantity }).ToList() 
        })
    .ToList();

3 - 演示

foreach(var item in result)
{
    Console.WriteLine($"{item.ProductName} : " +
        $"{string.Join(",", item.OrderWithQuantities.Select(x => $"{x.OrderNumer}::{x.Quantity}"))}");
}

4 - 结果:

p1 : o1::1,o2::1
p2 : o1::2,o2::2

我希望这会有所帮助。

于 2020-04-21T14:38:24.200 回答