Прежде всего вы должны преобразовать это:
{GroupId: ["A", "B"], GroupSum: 100},
{GroupId: ["A", "C"], GroupSum: 500},
{GroupId: ["D", "E"], GroupSum: 900},
{GroupId: ["F"], GroupSum: 50}
в это:
{Spec: "A", Total: 100},
{Spec: "B", Total: 100},
{Spec: "A", Total: 500},
{Spec: "C", Total: 500},
{Spec: "D", Total: 900},
{Spec: "E", Total: 900},
{Spec: "F", Total: 50}
, поэтому вам следует преобразовать спецификации в IEnumerable<string>
, как показано ниже:
var results = collection
.Select(list => new { Specs = list.Item.Specs.Select(s => string.Join(",", s.Split())), Price = list.PriceSold })
.SelectMany(i => i.Specs.Select(s => new { Spec = s, i.Price }));
Теперь ваша коллекция готова суммировать дубликаты.Для этого вам нужно добавить GroupBy и Select в ваш запрос:
// this is the final version
var results = collection
.Select(list => new { Specs = list.Item.Specs.Select(s => string.Join(",", s.Split())), Price = list.PriceSold })
.SelectMany(i => i.Specs.Select(s => new { Spec = s, i.Price }))
.GroupBy(g => new { g.Spec, g.Price })
.Select(i => new { i.Key.Spec, Total = i.Sum(p => p.Price) });
Примечание : Если это не сработало для вас (не волнуйтесь, этоу меня тоже не получилось. Я пробовал с разными версиями .net, но ничего не произошло.), просто удалите GroupBy и last Выберите и добавьте их версию linq в ваш проект.
Ваши запросы должны выглядеть следующим образом:
var results = collection
.Select(list => new { Specs = list.Item.Specs.Select(s => string.Join(",", s.Split())), Price = list.PriceSold })
.SelectMany(i => i.Specs.Select(s => new { Spec = s, i.Price }));
var res = from r in rawCollection
orderby r.Spec
group r by r.Spec into grp
let total = grp.Where(x => x.Spec == grp.Key).Sum(x => x.Price)
select new
{
Spec = grp.Key,
Total = total
};
И ваш желаемый результат ожидания.