2013-02-21 79 views
20

我有這兩個數據表,我想獲得它們之間的區別。這裏有一個例子:如何獲得兩個數據表之間的差異

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

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

我只是想要的結果的數據是在表1,而不是在表2(表1,表2)

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

我試圖通過LINQ到使用這兩個類似的解決方案,但它總是返回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 2013-02-21 12:52:35

+2

@ Tormod,但在他的第一個解決方案中,DataRowComparer的用途是什麼?它覆蓋'公共bool Equals(TRow leftRow,TRow rightRow)'來比較實際的列值。 – hometoast 2013-02-21 13:05:50

+2

你能展示你如何檢索你的數據表?數據可能與預期的不同嗎?我在LINQPad中做了一個快速示例,你的第一個解決方案似乎工作正常。 – goric 2013-02-21 13:13:07

回答

7

你可以試試下面的代碼...

table1.AsEnumerable().Where(
    r =>!table2.AsEnumerable().Select(x=>x["ID"]).ToList().Contains(r["ID"])).ToList(); 
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()到你的答案......

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

以上soluti當table2中有新行沒有出現在table1中時也可以使用。

distintTable constains Çd

0

請在下面嘗試,這是非常基本的。合併兩組,並獲得差異。如果這些套件不能正確對齊,那麼這將不起作用。

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

我希望這會有所幫助。我用這個打了幾個小時,發現大量的趣聞假線索,並最終合併了幾個不同的方式

+0

當我嘗試這一切時,我得到的GetChanges是集合的聯合,而不是差異。 – 2016-05-27 16:47:51

1

後比較RowStates試試這個

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

下面試試,這是相當基本。合併兩組,並獲得差異。如果這些套件不能正確對齊,那麼這將不起作用。 試圖測試相同

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(); 
相關問題