3 Stimmen

Wie wählen Sie mehrere Spalten aus datatable in Linq-Gruppe von?

Ich habe eine DataTable, und ich möchte mit einer Spalte gruppiert.

Ich verwende dafür diesen Code:

DataTable  dtList = list1.Items.GetDataTable();
         var grouped = from row in dtList.AsEnumerable()
                      group row by row["T"] into valueGroup
                      select new { Value = valueGroup.Key, ID = valueGroup.Max(id => id["ID"]) };

Mein Problem ist: es ist zwei Spalten auswählen (id, Wert). Ich möchte mehrere Spalten auswählen.

Wie kann man andere Spalten der dtlist auswählen?

2voto

Lukasz M Punkte 5445

Wenn Sie mehrere Spalten auswählen möchten, nach denen gruppiert werden soll, versuchen Sie Folgendes:

DataTable  dtList = list1.Items.GetDataTable();
var grouped = from row in dtList.AsEnumerable()
                      group row by new { T = row["T"], U = row["U"] } into valueGroup
                      select new { Value = valueGroup.Key, ID = valueGroup.Max(id => id["ID"]) };

Dadurch erhalten Sie mehrere Spalten, die als anonyme Objekte mit T y U Eigenschaften, die in der Value Feld des Rückgabesets.

Ich habe dies getestet und es scheint bei einem Beispieldatensatz zu funktionieren.

Sie basiert auf einer hier beschriebenen Lösung: http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/54f6ac70-e74c-4d9d-a9ee-6373714c0755 .

Editar

Bei der Verwendung von group by Klausel werden alle Elemente in Gruppen eingeteilt und für jede Gruppe wird nur ein Element zurückgegeben, so dass Sie, um auf eine Spalte zu verweisen, diese entweder in die group by Klausel oder verwenden Sie eine Aggregationsmethode dafür (wie Sie es mit ID Feld und Max() Methode).

Wenn Sie jedoch die Gruppen bilden wollen, sollten Sie die maximale ID für jede Gruppe und rufen Sie dann andere Spalten für diese Elemente ab (mit maximal ID Wert in jeder Gruppe) können Sie eine join mit der gleichen Tabelle. Dieser Code zeigt, wie Sie es in Ihrem Fall für Beispiel tun T y U Spalten. Bei einem Testdatensatz scheint es korrekt zu funktionieren:

var dtListEnumerable = dtList.AsEnumerable();
//group items and get max ID for each group
var groupedTemp = from row in dtListEnumerable
          group row by row["T"] into valueGroup
          select new { Value = valueGroup.Key, ID = valueGroup.Max(id => id["ID"]) };

//join to get the rest of columns for each item with max ID returned for each group
var grouped = from groupedItem in groupedTemp
          join row in dtListEnumerable on groupedItem.ID equals row["ID"]
              into tablesJoined
          from row in tablesJoined.DefaultIfEmpty()
          select new
          {
              ID = groupedItem.ID,
              T = row["T"], 
              U = row["U"]
          };

Wenn Sie dabei Hilfe brauchen, lassen Sie es mich wissen. Wenn die Daten, die Sie abrufen möchten, nicht zurückgegeben werden, geben Sie bitte weitere Einzelheiten an.

1voto

Hassan Boutougha Punkte 3865

Um mehrere Spalten (column1, column2, colummn3) auszuwählen, die sich in Ihrer dtList befinden:

DataTable  dtList = list1.Items.GetDataTable();
var grouped = from row in dtList.AsEnumerable()
                  group row by row["T"] into valueGroup
                  select new {
                         Value = valueGroup.Key,
                         ID = valueGroup.Max(id => id["ID"]),
                         col1 = row["column1"].ToString(),
                         col2 = row["column2"].ToString(),
                         col3 = row["column3"].ToString()
                          };

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X