Группировка списка сущностей, у которых есть подсписок в c # - PullRequest
0 голосов
/ 23 декабря 2009

У меня есть набор сущностей, который в основном имеет эту структуру.

{Stats Name="<Product name> (en)" TotalResources="10" ..}
    {DayStats Date="2009-12-10" TotalResources="5"}
    {DayStats Date="2009-12-11" TotalResources="5"}
{Stats}
{Stats Name="<Product name> (us)" TotalResources="10" ..}
    {DayStats Date="2009-12-10" TotalResources="5"}
    {DayStats Date="2009-12-11" TotalResources="5"}
{Stats}
...

Что я не хочу извлекать из этого набора, так это новые наборы сущностей (или сущности в приведенном выше примере), где первый уровень был сгруппирован по (игнорируя метку страны), где все / некоторые свойства были суммируются вместе, включая подсписок {DayStas} на ежедневной основе. Таким образом, набор результатов в примере будет выглядеть примерно так:

{Stats Name="<Product name>" TotalResources="20" ..}
    {DayStats Date="2009-12-10" TotalResources="10"}
    {DayStats Date="2009-12-11" TotalResources="10"}
{Stats}
...

Итак, мой вопрос: возможно ли сделать это более изящным способом в LINQ, а не ванильным путем "loop-trhough-each-entity-and-сравнить"?

И я не хочу, чтобы набор содержал сущности того же типа, что и исходный набор ({Stats}, {DayStats}), ваш ответ не должен включать в себя код для этого, вероятно, я могу решить это себя. Просто дайте вам знать, если вам нужно принять это во внимание.

(извините, если этот вопрос уже обсуждался, я пытался искать безрезультатно. Полагаю, мои навыки поиска - fuubar;))

Счастливого Рождества =)

Ответы [ 2 ]

0 голосов
/ 28 апреля 2010

Немного поздно, но, возможно, все еще полезно. RemoveCountry должен быть методом расширения, который возвращает имя статистики без суффикса страны.

IEnumerable<Stats> aggregated =
    from stat in stats
    group stat by stat.Name.RemoveCountry() into grp
    select new Stats
    {
        Name = grp.Key,
        TotalResources = (from stat in grp select stat.TotalResources).Sum(),
        DayStats = (from stat in grp
                    from dayStat in stat
                    group dayStat by dayStat.Date into dgrp
                    select new DayStats
                    {
                        Date = dgrp.Key,
                        TotalResources = (from dayStat in dgrp select dayStat.TotalResources).Sum()
                    }).ToList()
    };
0 голосов
/ 23 декабря 2009

Попробуйте:

 dataset.SelectMany(p => new {stat=p, daystats=p.DayStats)
        .GroupBy(c => c.stat.Name.SubString(0, c.stat.Name.Length - 5))
...