2013-10-16 5 views
10

Ich versuche, die doppelten Zeilen zu entfernen, indem Sie eine erste Zeile aus jeder Gruppe auswählen. Für BeispielWie verwende ich SELECT GROUP BY in DataTable.Select (Ausdruck)?

PK  Col1  Col2 
1  A  B 
2  A  B 
3  C  C 
4  C  C 

möchte ich eine Rückkehr:

PK  Col1  Col2 
1  A  B 
3  C  C 

Ich habe versucht, Code folgende aber es hat nicht funktioniert:

DataTable dt = GetSampleDataTable(); //Get the table above. 
dt = dt.Select("SELECT MIN(PK), Col1, Col2 GROUP BY Col1, Col2); 
+0

Sie können nicht. Verwenden Sie stattdessen LINQ. – SLaks

+0

Sie dürfen nicht nach dem PK-Feld gruppieren ... – Baral

+0

Ich möchte was auch immer verwenden, aber ich möchte ein DataTable-Objekt zurückgeben. –

Antwort

22

DataTable ‚s Select Verfahren nur Träger einfache Filterausdrücke wie {field} = {value}. Es unterstützt keine komplexen Ausdrücke, geschweige denn SQL/Linq-Anweisungen.

Sie können jedoch bei der Verwendung von Linq-Erweiterungsmethoden eine Sammlung von DataRow s extrahieren dann erstellen Sie eine neue DataTable.

dt = dt.AsEnumerable() 
     .GroupBy(r => new {Col1 = r["Col1"], Col2 = r["Col2"]}) 
     .Select(g => g.OrderBy(r => r["PK"]).First()) 
     .CopyToDataTable(); 
+1

Welchen Assemblierverweis müssen Sie verwenden, damit dies funktioniert? Ich verwende System.data, aber der GroupBy-Befehl besagt, dass mir eine Assembly-Referenz fehlt. – user5013

+0

Welche Erweiterung ist das .CopyToDataTable()? –

+1

@SebastianWidz ['System.Data.DataSetExtensions'] (https://msdn.microsoft.com/en-us/library/bb396189 (v = vs.110) .aspx) –

5
dt = dt.AsEnumerable().GroupBy(r => r.Field<int>("ID")).Select(g => g.First()).CopyToDataTable(); 
+0

Welche Erweiterung ist das .CopyToDataTable()? –

0

Diese Lösung sortiert nach Col1 und gruppiert nach Col2. Dann extrahiere den Wert von Col2 und zeige ihn in einer mbox an.

var grouped = from DataRow dr in dt.Rows orderby dr["Col1"] group dr by dr["Col2"]; 
string x = ""; 
foreach (var k in grouped) x += (string)(k.ElementAt(0)["Col2"]) + Environment.NewLine; 
MessageBox.Show(x); 
3

Tim Schmelter Antwort https://stackoverflow.com/a/8472044/26877

public DataTable GroupBy(string i_sGroupByColumn, string i_sAggregateColumn, DataTable i_dSourceTable) 
{ 

    DataView dv = new DataView(i_dSourceTable); 

    //getting distinct values for group column 
    DataTable dtGroup = dv.ToTable(true, new string[] { i_sGroupByColumn }); 

    //adding column for the row count 
    dtGroup.Columns.Add("Count", typeof(int)); 

    //looping thru distinct values for the group, counting 
    foreach (DataRow dr in dtGroup.Rows) { 
     dr["Count"] = i_dSourceTable.Compute("Count(" + i_sAggregateColumn + ")", i_sGroupByColumn + " = '" + dr[i_sGroupByColumn] + "'"); 
    } 

    //returning grouped/counted result 
    return dtGroup; 
} 

Beispiel:

DataTable desiredResult = GroupBy("TeamID", "MemberID", dt);