2013-02-21 15 views
20

私はこれらの2つのデータテーブルを持っており、それらの違いを知りたいと思います。次に例を示します。2つのデータテーブルの違いを取得する方法

Table1 
------------------------- 
ID | Name 
-------------------------- 
1 | A 
2 | B 
3 | C 
-------------------------- 

Table2 
------------------------- 
ID | Name 
-------------------------- 
1 | A 
2 | B 
-------------------------- 

私はちょうど結果は表1にしていないtable2の中にあるデータ(TABLE1-table2の)

ResultTable 
------------------------- 
ID | Name 
-------------------------- 
3 | C 
-------------------------- 

として、私は、LINQのを経由してこれらの2つの同様のソリューションを使用しようとしたたい常にtable1を返し、table1-table2は返しません。

DataTable table1= ds.Tables["table1"]; 
DataTable table2= ds.Tables["table2"]; 
var diff= table1.AsEnumerable().Except(table2.AsEnumerable(),DataRowComparer.Default); 

第二の溶液:

var dtOne = table1.AsEnumerable(); 
var dtTwo = table2.AsEnumerable(); 
var difference = dtOne.Except(dtTwo); 

ので、間違いがあるここで最初のソリューションですか?すべてのあなたの答えをありがとうございました。 :)

+2

これらのチェックは除きますが、同じインスタンスではありません。それぞれの特性が同一ではない。 EqualityComparerを受け入れるオーバーロードを使用するか、さまざまなLINQ +ライブラリで実装されている拡張メソッドExceptBy()を調べることができます.Jon Skeets MoreLinq(http://code.google.com/p/morelinq/) – Tormod

+2

@ Tormodですが、最初の解決策では 'DataRowComparer'の使用は何ですか?実際の列の値を比較するために 'public bool Equals(TRow leftRow、TRow rightRow) 'をオーバーライドします。 – hometoast

+2

データテーブルをどのように取得しているかを表示できますか?データが期待どおりに異なる可能性はありますか?私はLINQPadで簡単なサンプルを行い、最初の解決策はうまくいくようです。 – goric

答えて

7

あなたは以下のコードを試すことができます...

table1.AsEnumerable().Where(
    r =>!table2.AsEnumerable().Select(x=>x["ID"]).ToList().Contains(r["ID"])).ToList(); 
1

私は列レベルではなく、データテーブルの上にそれを実行しようとします。

IEnumerable<int> id_table1 = table1.AsEnumerable().Select(val=> (int)val["ID"]); 
IEnumerable<int> id_table2 = table2.AsEnumerable().Select(val=> (int)val["ID"]); 
IEnumerable<int> id_notinTable1= id_table2.Except(id_table1); 

だけ

0

は、以下の方法を試してみてください...あなたの答えへ.Select()を追加:

初期化:

var columnId = new DataColumn("ID", typeof (int)); 
var columnName = new DataColumn("Name", typeof (string)); 
var table1 = new DataTable(); 
table1.Columns.AddRange(new[] {columnId, columnName}); 
table1.PrimaryKey = new[] {columnId}; 
table1.Rows.Add(1, "A"); 
table1.Rows.Add(2, "B"); 
table1.Rows.Add(3, "C"); 

var table2 = table1.Clone(); 
table2.Rows.Add(1, "A"); 
table2.Rows.Add(2, "B"); 
table2.Rows.Add(4, "D"); 

ソリューション:soluti上記

var table3 = table1.Copy(); 
table3.AcceptChanges(); 
table3.Merge(table2); 

var distinctRows = from row in table3.AsEnumerable() 
        where row.RowState != DataRowState.Modified 
        select row; 

var distintTable = distinctRows.CopyToDataTable(); 

onは、table2にtable1に存在しなかった新しい行がある場合にも機能します。

distintTable constains CD

0

以下を試してみてください。これはかなり基本的です。 2つのセットをまとめて差をつけます。セットが正しく整列しないと、これは機能しません。

DataSet firstDsData = new DataSet(); 
DataSet secondDsData = new DataSet(); 
DataSet finalDsData = new DataSet(); 
DataSet DifferenceDataSet = new DataSet(); 
finalDsData.Merge(firstDsData); 
finalDsData.AcceptChanges(); 
finalDsData.Merge(secondDsData); 
DifferenceDataSet = finalDsData.GetChanges(); 
5

私はちょうどこれを通過し、私の所見を共有したかった。私のアプリケーションでは、データの同期メカニズムですが、元の質問にどのように適用されるのかが分かります。私の場合は

は、私は私の最後データのアップロードを表現し、いつか将来的には、私はデータの現在の状態を取得し、違いのみをアップロードする必要がDataTableを持っていました。

// get the Current state of the data 
DataTable dtCurrent = GetCurrentData(); 

// get the Last uploaded data 
DataTable dtLast = GetLastUploadData(); 
dtLast.AcceptChanges(); 

// the table meant to hold only the differences 
DataTable dtChanges = null; 

// merge the Current DataTable into the Last DataTable, 
// with preserve changes set to TRUE 
dtLast.Merge(dtCurrent, true); 

// invoke GetChanges() with DataRowState.Unchanged 
// !! this is the key !! 
// the rows with RowState == DataRowState.Unchanged 
// are the differences between the 2 tables 
dtChanges = dtLast.GetChanges(DataRowState.Unchanged); 

これが役立ちます。私は数時間のためにこれと戦った、とinterwebzに偽リードをたくさん見つけて、RowStatesを比較することになったいくつかの異なる方法をマージした後

+0

私がGetChangesから出てくるすべてを試してみると、その違いはなく、セットの和集合です。 –

1

この

DataTable dtmismatch = Table1.AsEnumerable().Except(Table2.AsEnumerable(), DataRowComparer.Default).CopyToDataTable<DataRow>(); 
1

が、これがかなりあり、以下試してみ基本的。 2つのセットをまとめて差をつけます。セットが正しく整列しないと、これは機能しません。 同じことを試してみる

DataSet firstDsData = new DataSet(); 
DataSet secondDsData = new DataSet(); 
DataSet finalDsData = new DataSet(); 
DataSet DifferenceDataSet = new DataSet(); 
finalDsData.Merge(firstDsData); 
finalDsData.AcceptChanges(); 
finalDsData.Merge(secondDsData); 
DifferenceDataSet = finalDsData.GetChanges(); 
関連する問題