it-swarm.com.de

Wie verwende ich SELECT GROUP BY in DataTable.Select (Ausdruck)?

Ich versuche, die doppelten Zeilen zu entfernen, indem ich aus jeder Gruppe eine erste Zeile auswähle

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

Ich möchte eine Rückkehr:

PK     Col1     Col2
1        A        B
3        C        C

Ich habe folgenden Code ausprobiert, aber er hat nicht funktioniert:

DataTable dt = GetSampleDataTable(); //Get the table above.
dt = dt.Select("SELECT MIN(PK), Col1, Col2 GROUP BY Col1, Col2);
15
J - C Sharper

Die DataTable-Methode von Select unterstützt nur einfache Filterausdrücke wie {field} = {value}. Es unterstützt keine komplexen Ausdrücke, ganz zu schweigen von SQL/Linq-Anweisungen.

Sie können jedoch Linq-Erweiterungsmethoden verwenden, um eine Sammlung von DataRows zu extrahieren, und erstellen Sie dann eine new DataTable.

dt = dt.AsEnumerable()
       .GroupBy(r => new {Col1 = r["Col1"], Col2 = r["Col2"]})
       .Select(g => g.OrderBy(r => r["PK"]).First())
       .CopyToDataTable();
31
D Stanley
dt = dt.AsEnumerable().GroupBy(r => r.Field<int>("ID")).Select(g => g.First()).CopyToDataTable();
6
J - C Sharper

Tim Schmelters 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);
3
JJS
dt.AsEnumerable()
    .GroupBy(r => new { Col1 = r["Col1"], Col2 = r["Col2"] })
    .Select(g =>
    {
        var row = dt.NewRow();

        row["PK"] = g.Min(r => r.Field<int>("PK"));
        row["Col1"] = g.Key.Col1;
        row["Col2"] = g.Key.Col2;

        return row;

    })
    .CopyToDataTable();
1
esc

Diese Lösung sortiert nach Col1 und gruppiert nach Col2. Dann extrahieren Sie den Wert von Col2 und zeigen Sie 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);
0
Alfred Wallace