2013-10-16 5 views
10

私はすべてのグループから最初の行を選択して重複する行を削除しようとします。例DataTable.Select(式)でSELECT GROUP BYを使用するにはどうすればよいですか?

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); 
+0

あなたがすることはできません。代わりにLINQを使用してください。 – SLaks

+0

PKフィールドでグループ化しないでください... – Baral

+0

私は何でも使いたいですが、DataTableオブジェクトを返したいと思います。 –

答えて

22

DataTableSelect方法のみをサポート簡単なフィルタリング式は{field} = {value}です。 SQL/Linqステートメントだけでなく、複雑な式もサポートしていません。

あなたは、しかし、その後、新しいDataTableを作成DataRowのコレクションを抽出するためにLINQの拡張メソッドを使用することができます。

+1

これを機能させるには、どのアセンブリリファレンスを使用する必要がありますか。私はSystem.dataを使用していますが、GroupByコマンドはアセンブリ参照がないことを示しています。 – user5013

+0

この拡張子は何ですか.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

この拡張子は何ですか.CopyToDataTable()? –

0

この解決方法は、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); 
3

ティム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; 
} 

例:

DataTable desiredResult = GroupBy("TeamID", "MemberID", dt); 
関連する問題