Linq трансформирует родительский список подсписков, которые будут сгруппированы по подспискам - PullRequest
0 голосов
/ 21 апреля 2020

Извините за этот неясный заголовок, но я не уверен, как его назвать. Будет проще показать это:

Пример объекта:

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>, и у каждого заказа есть список продуктов вместе с количеством , Заказы всегда имеют один и тот же список товаров, только разные количества. Прямо сейчас все сгруппировано по заказам, как перевернуть его для группировки по продуктам.

Чтобы лучше визуализировать это, я покажу, чего я хочу достичь на псевдо-jsons.

Текущий json сгенерированный:

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

И я хочу добиться чего-то вроде этого:

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

Я пытался использовать выбор и группировать по но я не могу решить это.

1 Ответ

1 голос
/ 21 апреля 2020

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

Я надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...