我在StackOverflow上的第一个问题。我在网上搜索过但没有找到这样一个具体案例。我将尝试尽可能具体。
我有一个Data
个对象数组:
Data:
[
{ ID:"ID1", Name:"Name1", Date:"2015-08-21", TypeA:{ Count:1 }, TypeB:{ Count:2 } },
{ ID:"ID2", Name:"Name2", Date:"2015-08-21", TypeA:{ Count:3 }, TypeB:{ Count:4 } },
{ ID:"ID3", Name:"Name3", Date:"2015-08-23", TypeA:{ Count:5 }, TypeB:{ Count:6 } }
]
我试图根据Type
属性将所有这些对象数组分组到新对象中,即如果TypeX.Count > 0
然后将其添加到Type主对象中。然后根据Date
属性添加它们,如果日期相同,则在同一日期合并它们:
TypeA:
{
Dates:
[
{ Date: "2015-08-21",
Data:
[
{ ID: "ID1", Name: "Name1", Count: 1 },
{ ID: "ID2", Name: "Name2", Count: 3 }
]
},
{ Date: "2015-08-23",
Data:
[
{ ID: "ID3", Name: "Name1", Count: 5 }
]
}
]
},
TypeB:
{
Dates:
[
{ Date: "2015-08-21",
Data:
[
{ ID: "ID1", Name: "Name1", Count: 2 },
{ ID: "ID2", Name: "Name2", Count: 4 }
]
},
{ Date: "2015-08-23",
Data:
[
{ ID: "ID3", Name: "Name3", Count: 6 }
]
}
]
}
我使用Javascript完成了这项工作,但现在我需要将整个逻辑传输到服务器端 - C#/ linq。
非常感谢任何帮助。
答案 0 :(得分:1)
您需要GroupBy两次: -
var result = Data.GroupBy(x => x.Type)
.Select(x => new
{
TypeAB = x.Key,
Obj = x.GroupBy(z => z.Date)
.Select(z => new
{
Date = z.Key,
InnerObj = z.Select(i => new
{
Id = i.Id,
Name = i.Name,
Count = i.Count
})
}).ToArray()
});
第一组Type
,它将返回Key
(除了TypeA,TypeB等)和IEnumerable(每个Type中的对象)。进一步按Date
对此列表进行分组,并投影Key以及其他对象。在这里我投影匿名类型,如果你有一个,你可以选择实际的Type
。