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.