如何为以下输出编写Linq查询

本文关键字:Linq 查询 输出 | 更新日期: 2023-09-27 18:03:45

var Shopping= new[] 
{
    new { Code = 1, Name = "Store 1", Type="Test1", Value="Bean"},
    new { Code = 1, Name = "Store 1", Type="Test2", Value="Broccoli"},
    new { Code = 2, Name = "Store 1", Type="Test1", Value="Beetroot"},
    new { Code = 11, Name = "Store 2", Type="Test1", Value="Apple"},
    new { Code = 11, Name = "Store 2" , Type="Test2", Value="Mango"}    
};
输出:

存储1

  Code Test1 Test2
   1   Bean  Broccoli
   2         Beetroot

存储2

  Code Test1 Test2
   11  Apple Mango

我如何在Linq c#中查询以下输出?

如何为以下输出编写Linq查询

要达到你想要达到的目标,你需要做2次GroupBy。首先是Name(存储),然后在其中按Code分组。最终,为了从不同的行中得到你想要的不同字段,它被称为透视。

var result = Shopping.GroupBy(item => item.Name)
        .Select(group => new
        {
            Store = group.Key,
            Items = group.GroupBy(item => item.Code)
                         .Select(innerGroup => new
                         {
                             Code = innerGroup.Key,
                             //This is the pivoting part - I create a "column" and collect under it all the values for that type
                             Test1 = innerGroup.Where(item => item.Type == "Test1").Select(item => item.Value).ToList(),
                             Test2 = innerGroup.Where(item => item.Type == "Test2").Select(item => item.Value).ToList(),
                         }).ToList()
        }).ToList();
  1. 注意:你的数据有一个错误- Value记录BeetrootType应该是Test2,而不是Test1
  2. 我已经添加了所有的ToLists()只是为了方便调试时-他们是不需要的。

你也可以把它转换成字典:

var stores = Shopping.GroupBy(item => item.Name)
        .Select(group => new
        {
            Store = group.Key,
            Items = group.GroupBy(item => item.Code)
                         .Select(innerGroup => new
                         {
                             Code = innerGroup.Key,
                             Test1 = innerGroup.Where(item => item.Type == "Test1").Select(item => item.Value).ToList(),
                             Test2 = innerGroup.Where(item => item.Type == "Test2").Select(item => item.Value).ToList(),
                         }).ToDictionary(key => key.Code, value => value)
        }).ToDictionary(key => key.Store, value => value.Items);
然后写入result["Store 1"][1].Test1