2012-02-27 12 views
2

DataTableの項目をフィルタリングしたいのですが、列値が文字列配列内に含まれているかどうかをIEnumerable<DataRow>に変換して、それは私の方法が返さなければならないものなので、DataTableに変換してください。ここでDataTableを列挙し、項目をフィルタ処理してからDataTableに戻す

は、これまでの私のコードです:

string[] ids = /*Gets string array of IDs here*/ 
DataTable dt = /*Databasecall returning a DataTable here*/ 
IEnumerable<DataRow> ie = dt.AsEnumerable(); 
ie = ie.Where<DataRow>(row => ids.Contains(row["id"].ToString())); 
/*At this point I've filtered out the entries I don't want, now how do I convert this back to a DataTable? The following does NOT work.*/ 
ie.CopyToDataTable(dt, System.Data.LoadOption.PreserveChanges); 
return dt; 
+0

、最初に確認してくださいパラメータ。 –

+0

よく私は私の答えを持っていた、コメントを削除してください、申し訳ありません。 –

+0

しかし、最初のパラメータは_source_であることを意味する_still_ ...私はあなたが_result_に割り当てられるdtを必要と思うと思います。(ここではsmthがありませんか?) –

答えて

1

私は、データテーブルの空のクローン作成します。次に、フィルタに一致する古いテーブルから行をインポート

DataTable newTable = dt.Clone(); 

を:私はそれを割り当てています

foreach(DataRow row in ie) 
{ 
    newTable.ImportRow(row); 
} 
+0

これは私が今やっていることです。元のDataTableを利用したより洗練されたソリューションを望みました。 –

1

は、あなたがその場で行をフィルタリングすると仮定すると、それを濾過した行を介して作成された同じDataTableに返されるべきです元のデータベースのクエリ、最初のクリアDataTable.Rowsコレクションする必要があります。その後、配列にフィルタ行をコピーする必要があり、順次追加してください:

ie = ie.Where<DataRow>(row => ids.Contains(row["id"].ToString())).ToArray(); 
dt.Rows.Clear(); 

foreach (var row in ie) 
{ 
    dt.Rows.Add(row); 
} 

簡単にフィルタリングする必要があるものを一度DataTable内の行を反復処理し、削除することができ、これを達成するための別の方法をアウト:

foreach (var row in dt.Rows) 
{ 
    if (ids.Contains(row["id"].ToString()) == false) 
    { 
     row.Delete(); 
    } 
} 

dt.AcceptChanges(); 

DataTableupdate the databaseに使用されているDataSetの一部である場合、DataTable.Rowsコレクションに対して行われたすべての変更は、対応するデータベースに反映されることに注意してください更新中のテーブル。

+1

DataTableをクリアすると、IEnumerableもクリアされます。 ForEachループ内で各行を繰り返して削除すると、(論理的に)反復処理中にコレクションを変更したため、エラーが表示されます。 forループを使用するか2nd DataTableを作成するのはオプションですが、少し汚れたものを探しています。 –

+0

@DennisRöttgerなぜあなたは新しいタブーを作成するのが既存のものを変えるよりも汚いと思うのですか? –

+0

@DennisRöttger修正します。代わりに[DataRow.Delete()](http://msdn.microsoft.com/en-us/library/system.data.datarow.delete.aspx)メソッドを使用するように私のサンプルを修正しましたが、これは有効になりません[DataTable.AcceptChanges()](http://msdn.microsoft.com/en-us/library/system.data.datarow.acceptchanges.aspx)を呼び出すまで。 –

関連する問題