私は次のフラットな構造を持っています:
Name1 | Name2 | Price | SubName | SubPrice
------+-------+-------+---------+---------
A | one | 10 | X | 5
A | one | 10 | Y | 7
A | one | 10 | Z | 11
A | one | 10 | X | 5
A | one | 10 | Y | 7
A | one | 10 | Z | 11
A | two | 16 | X | 5
A | null | 9 | null | null
B | three | 24 | null | null
次のように変換する必要があります。
{
0 = {
Name = "A one X, Y, Z",
Quantity = 2,
TotalPrice = 66,
},
1 = {
Name = "A two X",
Quantity = 1,
TotalPrice = 21,
},
2 = {
Name = "A",
Quantity = 1,
TotalPrice = 9,
},
3 = {
Name = "B three",
Quantity = 1,
TotalPrice = 24,
}
}
理論は単純です - .GroupBy()
Name1 と Name2 - 問題は、いったん.Select()
グループから外れると、正しい Quantity を取得できないことです... これは単純であるべきだとわかっていますが、理解できないようです。 ..
items
.GroupBy(item => new
{
item.Name1,
item.Name2,
})
.Select(grouping => new
{
Name = grouping.Key.Name1 + " " + grouping.Key.Name2,
Price = grouping.Key.Price,
Subs = grouping.GroupBy(groupItem => new
{
groupItem.SubName,
groupItem.SubPrice,
}),
})
.Select(temp => new
{
Name = temp.Name + (temp.Subs.Any() ? " " + temp.Subs.Select(sub => sub.SubName).Aggregate((a, b) => (a + ", " + b)) : string.Empty),
FullItemPrice = temp.Price + temp.Subs.Sum(subPrice => subPrice ?? 0m),
Quantity = ???,
})
.Select(output => new
{
output.Name,
output.Quantity,
TotalPrice = output.FullItemPrice * output.Quantity,
});