2013-10-16 16 views
10

Provo a rimuovere le righe duplicate selezionando una prima riga da ogni gruppo. Per esempioCome utilizzare SELECT GROUP BY in DataTable.Select (Espressione)?

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

Voglio un ritorno:

PK  Col1  Col2 
1  A  B 
3  C  C 

ho provato seguente codice, ma non ha funzionato:

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

Non è possibile. Usa invece LINQ. – SLaks

+0

Non è necessario raggruppare per il campo PK ... – Baral

+0

Vorrei utilizzare qualsiasi cosa, ma desidero restituire un oggetto DataTable. –

risposta

22

s' DataTableSelect metodo solo supporti semplici espressioni di filtraggio come {field} = {value}. Non supporta espressioni complesse, né tanto meno istruzioni SQL/Linq.

È possibile, tuttavia, utilizzare metodi di estensione Linq per estrarre una raccolta di DataRow s quindi creare una nuova DataTable.

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

Quale riferimento all'assembly è necessario utilizzare per farlo funzionare. Sto usando System.data ma il comando GroupBy sta affermando che mi manca un riferimento all'assembly. – user5013

+0

Che estensione è questa .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

Che estensione è questa .CopyToDataTable()? –

0

Questa soluzione ordina per Col1 e gruppo per Col2. Quindi estrarre il valore di Col2 e visualizzarlo in un mbox.

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

risposta di Tim Schmelter 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; 
} 

Esempio:

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