2016-07-28 13 views
1

Ich habe die folgende Tabellenstruktur. Ich möchte Wert für Schlüssel für jeden Gruppennamen abrufen und einfügen es speichern sequenziell in einer ModellklasseC# Konvertieren von Spalten in Zeilen mit Linq?

die Tabellendaten wurden mit einem ExecuteQuery gelesen und in einer Liste von Klassenobjekt gespeichert, im folgenden Beispiel werde ich habe 4 Zeilen zurückgegeben. Ich muss es in 2 Zeilen konvertieren, wobei die Spaltenwerte als Zeilen eingehen.

Table Data Structure
ich den folgenden Code haben jetzt geschrieben, aber gibt es eine andere Möglichkeit, es zu überprüfen, ohne zu sagen Key == "GroupSpecificProperty1" explizit überprüft?

Wenn es eine dritte Kategorie später hinzugefügt ist, sollte ich nicht den Code zu ändern haben

Result = results.GroupBy(p => p.GroupName) 
       .Select(g => new FinalModel() 
    { 
     GroupName = g.Select(p => p.GroupName).FirstOrDefault(), 
     GroupSpecificProperty1 = g.Where(q => q.Key == "GroupSpecificProperty1").Select(v => v.Value).Cast<string>().FirstOrDefault(), 
     GroupSpecificProperty2= g.Where(q => q.Key == "GroupSpecificProperty2").Select(v => v.Value).Cast<string>().FirstOrDefault(), 
    }).ToList(); 
+0

Ist es möglich, dass Sie das Thema nach einer anderen Frage geschrieben haben? Kann nicht dorthin kommen, wo der 'Spalten in Zeilen konvertieren'-Teil ist !? – C4u

+1

Wenn eine dritte Kategorie hinzugefügt wird, müssen Sie 'FinalModel' ändern, es sei denn, Sie möchten das durch einen dynamischen Typ ersetzen. Das oder 'FinalModel' könnte ein' Dictionary 'enthalten. – juharr

+0

Hmm, guter Punkt, siehst du einen anderen Weg, um mein Ergebnis zu erreichen als das, was ich geschrieben habe? – KeenUser

Antwort

3
results.GroupBy(p => p.GroupName) 
      .Select(g => new FinalModel 
      { 
       GroupName = g.Key, 
       Properties = g.ToDictionary(item => item.Key, item=> item.Value) 
      }); 

Und in dem Fall, dass für eine gegebene GroupName die Schlüssel nicht eindeutig zuzuordnen sind, und Sie würden eine vermeiden wollen „Schlüssel ist bereits vorhanden“ Ausnahme dann können Sie:

results.GroupBy(p => p.GroupName) 
     .Select(g => new FinalModel 
     { 
      GroupName = g.Key, 
      Properties = g.GroupBy(item => item.key) 
          .ToDictionary(innerGroup => innerGroup.Key, 
             innerGroup => innerGroup.Select(innerItem => innerItem.Value)) 
     }); 

dann können Sie natürlich auch die Außen-/Innen Wörterbuch mit einem Nachschlag ersetzen, wenn es besser auf Ihre Bedürfnisse passt.

Verwandte Themen