すべてのグループから最初の行を選択して、重複した行を削除しようとします。例えば
PK Col1 Col2
1 A B
2 A B
3 C C
4 C C
返品が必要です:
PK Col1 Col2
1 A B
3 C C
私は次のコードを試しましたが、うまくいきませんでした:
DataTable dt = GetSampleDataTable(); //Get the table above.
dt = dt.Select("SELECT MIN(PK), Col1, Col2 GROUP BY Col1, Col2);
DataTable
のSelect
メソッドは、{field} = {value}
。 SQL/Linqステートメントはもちろんのこと、複雑な式はサポートしていません。
ただし、Linq拡張メソッドを使用してDataRow
sのコレクションを抽出し、newDataTable
を作成できます。
dt = dt.AsEnumerable()
.GroupBy(r => new {Col1 = r["Col1"], Col2 = r["Col2"]})
.Select(g => g.OrderBy(r => r["PK"]).First())
.CopyToDataTable();
dt = dt.AsEnumerable().GroupBy(r => r.Field<int>("ID")).Select(g => g.First()).CopyToDataTable();
ティム・シュメルターの答え 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;
}
例:
DataTable desiredResult = GroupBy("TeamID", "MemberID", dt);
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();
このソリューションはCol1でソートし、Col2でグループ化します。次に、Col2の値を抽出し、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);