2013-02-21 78 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(); 
相关问题