0

さまざまなソース(SQLおよびMS Access)からメモリにロードされたDataTableがいくつかあり、各データセットには複数の列があり、各データセット間で同じ列のサブセットのみが含まれています。私はいくつかのデータ同期コードに取り組んでおり、これらのデータテーブルを比較したいのですが、それらが共通している列に基づいてのみ比較します。必要な場合は、おそらく多くのループでこれを行うことができますが、LINQをより快適に使用し、より簡潔なコードを使用したいと考えています。

これまでのところ、各データテーブルから列名のリストを取得し、Intersectを使用して、次のように両方に共通の列名のリストを取得しました。

private string[] Common_ColumnNames {
    get {
        // get column names from source & destination data
        string[] src_columnNames = 
        (from dc in _srcDataTable.Columns.Cast<DataColumn>() 
        select dc.ColumnName).ToArray();

        string[] dest_columnNames = 
        (from dc in _destDataTable.Columns.Cast<DataColumn>() 
        select dc.ColumnName).ToArray();

        // find the column names common between the two data sets 
        // - these are the columns to be compared when synchronizing
        return src_columnNames.Intersect( dest_columnNames ).ToArray();                
    }
}

今、私は立ち往生しています...各DataTableからすべての行を選択する必要がありますが、それらの共通の列のみを選択します。私の頭の中で、これはいくつかの異なる方法で機能していることがわかります。

1)データテーブルからすべての行を選択し、目的の列リストstring []変数を渡して、必要な列をLINQに通知します

2)データテーブルからすべての行を選択し、ラムダ関数(私にとってもかなり新しい)を使用して各行から不要な列を削除し、いくつかの削除された列を含む新しいデータテーブルを出力します。

これを実現する方法についてのアドバイス/提案をいただければ幸いです。ありがとう!

4

1 に答える 1

1

それはLinQではありませんが、DataViewを使用すると非常に簡単です。

string[] commonCols = obj.Common_Columns;
DataView myTableView = new DataView(srcDataTable); 
DataTable srcReducedTable = myTableView.ToTable(false, commonCols); 

MSDN参照

于 2012-08-24T19:19:24.717 に答える