22

これら2つのデータテーブルがあり、それらの違いを取得したいと考えています。次に例を示します。

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

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

table2ではなくtable1にあるデータとして結果が欲しいだけです(table1-table2)

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

Linq を介してこれら 2 つの同様のソリューションを使用しようとしましたが、常に table1-table2 ではなく table1 を返します。最初の解決策は次のとおりです。

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

2番目の解決策:

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

では、どこが間違っているのでしょうか。たくさんのご回答ありがとうございます。:)

4

8 に答える 8

7

次のコードを試すことができます...

table1.AsEnumerable().Where(
    r =>!table2.AsEnumerable().Select(x=>x["ID"]).ToList().Contains(r["ID"])).ToList();
于 2013-02-21T12:58:00.357 に答える
1

DataTableではなく列レベルでそれを実行しようとします。

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

.Select()答えにを追加するだけです...

于 2013-02-21T13:01:12.370 に答える
1

これを試して

DataTable dtmismatch = Table1.AsEnumerable().Except(Table2.AsEnumerable(), DataRowComparer.Default).CopyToDataTable<DataRow>();
于 2015-08-27T10:33:59.700 に答える
0

以下のアプローチを試してください。

初期化:

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");

解決:

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();

上記のソリューションは、table1 には存在しなかった table2 に新しい行がある場合にも機能します。

distintTableCとDが含まれます。

于 2013-02-21T13:10:48.627 に答える