如何为以下输出编写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#中查询以下输出?
要达到你想要达到的目标,你需要做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();
- 注意:你的数据有一个错误-
Value
记录Beetroot
的Type
应该是Test2
,而不是Test1
我已经添加了所有的
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