2009-08-03 5 views
0

Ich habe eine Abfrage, die Daten für eine Reihe von Dataseries in einem Stück zurückgibt.Best Practice beim Aufteilen von Abfrageergebnis nach einer Spalte

Ich möchte diese Daten in die Datenserien-ID aufteilen, durch die Dataseries ID. Die Abfrage kann nicht geändert werden.

Es ist nicht sicher anzunehmen, dass die Daten nach der Serien-ID geordnet sind. Was wäre der beste Weg, dies zu tun? LINQ?

Antwort

2

Ich empfehle die Gruppierung das Ergebnis von der DataSeriesId.

var groupedResult = QueryDatabase().GroupBy(item => item.DataSeriesId); 

Jetzt können Sie wie folgt auf die gruppierten Daten zugreifen. In diesem Beispiel werden nur alle Gruppen mit allen Elementen gedruckt.

foreach(var group in groupedResult) 
{ 
    Console.WriteLine("Group: " + group.Key); 

    foreach(var item in group) 
    { 
     Console.WriteLine(" Item: " + item); 
    } 
} 

Oder Sie können das Ergebnis der Datenbankabfrage in eine Liste von Listen gruppieren.

IList<IList<DataItem>> = QueryDatabase() 
    .GroupBy(item => item.DataSeriesId) 
    .Select(group => group.ToList()) 
    .ToList(); 

Oder Sie können ein Wörterbuch von DataSeriesId auf eine Liste von Datenelementen aus der Datenbank Abfrageergebnis bauen.

IDictionary<Int32, IList<DataItem>> = QueryDatabase() 
    .GroupBy(item => item.DataSeriesId) 
    .ToDictionary(group => group.DataSeriesId, group => group.ToList()); 

Oder Enumerable.ToLookUp() verwenden, wenn Sie das Wörterbuch nicht später ändern wollen.

UPDATE

bemerkt einfach die "Best Practice" in der Frage einer der "Datareader" -Tag. Nun, LINQ ist einfach zu schreiben und leicht zu bekommen, aber es ist wahrscheinlich nicht die schnellste Lösung. Je nach Ihren Anforderungen kann die Verwendung von LINQ eine gute oder schlechte Wahl sein. Ich würde LINQ bevorzugen, wenn Leistung (noch) kein Problem ist. Sonst würde ich ein Wörterbuch von DataSeriesId zu einer Liste von Datenelementen beim Lesen der Daten erstellen.

IDictionary<Int32, IList<DataItem>> result = 
    new Dictionary<Int32, IList<DataItem>>(); 

while (dataSource.DataAvailiable) 
{ 
    DataItem item = dataSource.ReadItem(); 

    IList<DataItem> items; 
    if (!result.TryGetValue(item.DataSeriesId)) 
    { 
     items = new List<DataItem>(); 

     result.Add(item.DataSeriesId, items); 
    } 

    items.Add(item); 
}