Jak napisać zapytanie LINQ, które odwraca grupowanie hierarchicznego źródła danych?

Jak napisać zapytanie LINQ, które pobiera hierarchiczne dane źródłowe i przekształca je tak, że grupowanie jest odwrócone?

Powiedzmy, że mam listę obiektów tematu, z których każdy zawiera zbiór znaczników reprezentujących metadane na tym temacie. Potrzebuję napisać zapytanie LINQ, aby w zasadzie odwrócić hierarchię, aby mieć listę tagów, z których każda ma zbiór tematów oznaczonych tym konkretnym tagiem.

Topic { Title = "Political Debate #1", Posted = 01/02/2008 }
   Tag { Name = "Contraversial", Color = "Red" }
   Tag { Name = "Politics", Color = "LightBlue" }
Topic { Title = "iPhone to support SiliverLight!", Posted = 02/23/2009 }
   Tag { Name = "BleedingEdge", Color = "LightBlue" }
   Tag { Name = "Contraversial", Color = "Red" }
   Tag { Name = ".NET", Color = "LightGreen" }
Topic { Title = "Fed Chairman admits guilt for causing second Great Depression", Posted = 06/15/2010 }
   Tag { Name = "Politics", Color = "LightBlue" }
   Tag { Name = "Contraversial", Color = "Red" }

Chcę, aby powyższe dane wyglądały jak wyniki poniżej.

Tag { Name = "Contraversial", Color = "Red" }
    Topic { Title = "Political Debate #1", Posted = 01/02/2008 }
    Topic { Title = "iPhone to support SiliverLight!", Posted = 23/02/2009 }
    Topic { Title = "Fed Chairman admits guilt for causing second Great Depression", Posted = 06/15/2010 }
Tag { Name = "Politics", Color = "LightBlue" }
    Topic { Title = "Political Debate #1", Posted = 01/02/2008 }
    Topic { Title = "Fed Chairman admits guilt for causing second Great Depression", Posted = 06/15/2010 }
Tag { Name = ".NET", Color = "LightGreen" }
    Topic { Title = "iPhone to support SiliverLight!", Posted = 23/02/2009 }

Możesz założyć, że każdy powtórzony fragment danych jest unikatowy w tym, że jest to pojedyncza instancja w pamięci, i że istnieje tylko kilka odniesień do tego samego obiektu. Rozsądne jest również, aby odpowiedź na użycie anonimowych klas do tworzenia projekcji, ponieważ zdaję sobie sprawę, że kształt klas może być nieco inny po inwersji.

AKTUALIZACJA: Dodałem poniższy kod, który ustawia przykładowe dane. Bawię się z odpowiedziami i niektórymi własnymi pomysłami w LinqPad.

var tags = new[]
{
    new { Name = "Contraversial", Color = "Red" },
    new { Name = "Politics", Color = "LightBlue" },
    new { Name = ".NET", Color = "LightGreen" },
    new { Name = "BleedingEdge", Color = "LightBlue" }

};

var topics = new[]
{
    new 
    { 
        Title = "Political Debate #1", 
        Posted = DateTime.Parse("01/02/2008"), 
        Tags = (from t in tags where new []{"Contraversial", "Politics"}.Contains(t.Name) select t),
    },
    new 
    { 
        Title = "iPhone to support SiliverLight!", 
        Posted = DateTime.Parse("02/23/2009"), 
        Tags = (from t in tags where new []{"BleedingEdge", "Contraversial", ".NET", }.Contains(t.Name) select t),
    },
    new 
    { 
        Title = "Fed Chairman admits guilt for causing second Great Depression", 
        Posted = DateTime.Parse("06/15/2010"), 
        Tags = (from t in tags where new []{"Contraversial", "Politics"}.Contains(t.Name) select t),
    },
};

questionAnswers(3)

yourAnswerToTheQuestion