¿Cómo escribo una consulta LINQ que invierte la agrupación de una fuente de datos jerárquica?

¿Cómo se escribiría una consulta LINQ que toma datos de origen jerárquicos y los transforma para que la agrupación se invierta?

Supongamos que tengo una lista de objetos de tema, cada uno de los cuales contiene una colección de etiquetas que representan etiquetas de metadatos en ese tema. Lo que necesito es escribir una consulta LINQ para básicamente cambiar la jerarquía de manera que tenga una lista de Etiquetas, cada una de las cuales tiene una colección de temas que están etiquetados con esa etiqueta en particular.

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" }

Quiero que los datos anteriores se vean como los resultados a continuación.

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 }

Puede suponer que cualquier parte repetida de datos es referencialmente única, ya que es una instancia única en la memoria y estas son solo varias referencias al mismo objeto. También es razonable que la respuesta utilice clases anónimas para producir la proyección, ya que me doy cuenta de que la forma de las clases puede ser ligeramente diferente después de la inversión.

ACTUALIZACIÓN: Agregué el siguiente código que configura los datos de ejemplo. Estoy jugando con las respuestas publicadas y algunas de mis propias ideas en 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),
    },
};

Respuestas a la pregunta(3)

Su respuesta a la pregunta