Wie schreibe ich eine LINQ-Abfrage, die die Gruppierung einer hierarchischen Datenquelle invertiert?
Wie würde man eine LINQ-Abfrage schreiben, die hierarchische Quelldaten aufnimmt und diese so umwandelt, dass die Gruppierung invertiert wird?
Angenommen, ich habe eine Liste von Topic-Objekten, von denen jedes eine Sammlung von Tags enthält, die Metadaten-Tags zu diesem Thema darstellen. Ich muss eine LINQ-Abfrage schreiben, um die Hierarchie grundsätzlich von innen nach außen umzukehren, sodass ich eine Liste von Tags habe, von denen jedes eine Sammlung von Themen enthält, die mit diesem bestimmten Tag markiert sind.
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" }
Ich möchte, dass die obigen Daten stattdessen wie die Ergebnisse unten aussehen.
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 }
Sie können davon ausgehen, dass jedes wiederholte Datenelement referenziell eindeutig ist, da es sich um eine einzelne Instanz im Speicher handelt und es nur mehrere Verweise auf dasselbe Objekt gibt. Es ist auch sinnvoll, für die Antwort anonyme Klassen zu verwenden, um die Projektion zu erstellen, da ich feststelle, dass die Form der Klassen nach der Inversion geringfügig abweichen kann.
UPDATE: Ich habe den folgenden Code hinzugefügt, der die Beispieldaten einrichtet. Ich spiele mit den Antworten und einigen meiner eigenen Ideen in 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),
},
};