Linq按列表的复杂类型分组

问题描述 投票:0回答:1

我正在尝试对列表的某些列表对象执行Linq GroupBy。

        public class ItemDto
        {

            public int ItemId { get; set; }
            public string ProductName { get; set; }
            public int Count { get; set; }
            public List<CondimentDto> Condiments { get; set; }
        }

       public class CondimentDto
        {
            public CondimentDto(int ItemId, string productName, decimal originalPrice)
            {
                ItemId = ItemId;
                ProductName = productName;
                OriginalPrice = originalPrice;

            }
            public int PosItemId { get; set; }
            public string ProductName { get; set; }
            public decimal OriginalPrice { get; set; }

        }

Here is list example.

var items = new List<ItemDto>();

            items.Add(new ItemDto(){ItemId = 1, ProductName = "Steak", Condiments = new List<CondimentDto>{new CondimentDto(11, "Mayonez", 1)}});
            items.Add(new ItemDto() { ItemId = 1, ProductName = "Steak", Condiments = new List<CondimentDto> { new CondimentDto(11, "Mayonez", 1) } });
            items.Add(new ItemDto() { ItemId = 1, ProductName = "Steak", Condiments = new List<CondimentDto> { new CondimentDto(11, "Hardal", 1) } });

Here is my LinQ Query;

var result = items.GroupBy(item => new {item.ItemId, item.Condiments})
                     .Select(x=>new ItemDto
                     {
                         ItemId = x.Key,
                         ProductName = x.First().ProductName,
                         Condiments = x.First().Condiments,
                         Count = x.Count()

                     })
                     .ToList();

我想做的是,我想按ItemId和调味品列表对列表进行分组。我期望的结果是

{
  items[
    {
      "ItemId": 1,
      "ProductName": "Steak",
      "Condiments": [
        {
          "ItemId": 11,
          "Name": "Mayonez",
          "Price": 1
        }
      ],
      "Count": 2
    },
    {
      "ItemId": 1,
      "ProductName": "Steak",
      "Condiments": [
        {
          "ItemId": 11,
          "Name": "Hardal",
          "Price": 1
        }
      ],
      "Count": 1
    }
  ]
}

因此,有两个相同的列表项,因此必须将其分组并且计数为2。而调味品的另一个不同项是Hardal。它是单独的,计数为1。

列表对象是否可能有两个组?顺便说一句,调味品可以为null。

谢谢

c# linq
1个回答
0
投票

也许您可以与ItemIdProductName分组:

var result = items
    .GroupBy(item => new { item.ItemId, item.Condiments?.FirstOrDefault()?.ProductName })
    .Select(x => new ItemDto
    {
        ItemId = x.Key.ItemId,
        ProductName = x.Key.ProductName,
        Condiments = x.FirstOrDefault()?.Condiments,
        Count = x.Count()

    })
    .ToList();
© www.soinside.com 2019 - 2024. All rights reserved.