比较数据表和返回行与更改

时间:2015-04-24 11:31:26

标签: c# asp.net linq

我正在尝试比较两个数据表并仅返回有变化的行。在下面的代码中,我将dt2克隆到dt3中,但它不会选择带有更改的行,而是将所有内容放在那里。请提出一些选择。

即使修改了单个单元格值,我也需要选择该行。每次比较时,两个数据表都具有相同的行和列集。

 Table 1              Table 2

ID   Name             ID     Name

1    Mark             1      Mark

2    Spencer          2      Spencer     

3    Ryan             3      George  

表3预期结果:

ID     Name

3      George

CODE:

DataTable dt3 = new DataTable();
// It will compare the 2nd table with the 1st table
var contacts = dt2.AsEnumerable().Except(dt1.AsEnumerable(), DataRowComparer.Default); 
dt3 = dt2.Clone();
foreach (DataRow rows in contacts)
 {
    dt3.ImportRow(rows);
 }

2 个答案:

答案 0 :(得分:1)

为此,您不需要两个表。只需在第二个GetChanges()上调用DataTable即可获得已更改的最后一行。确保您({1}}上没有(直接或间接)调用AcceptChanges(),否则DataTable将无法返回任何内容。

GetChanges()公开名为DataRow的属性,当其中一列或多列更改时,该属性设置为RowStateModifiedAcceptChanges()将此标记重置为RejectChanges()

通过调用Unmodified的索引器并设置第二个参数(DataRow),您甚至可以获得列的原始值(在您的情况下为Ryan)和当前值(在您的情况下为George)分别到RowVersionOriginal

答案 1 :(得分:0)

试试这个:

dt1.Select()
    .Join(dt2.Select(), x => x["Id"], y => y["Id"], (x, y) => new { x, y })
    .Where(z => z.x["Name"] != z.y["Name"])
    .Select(z => z.y);

此处dt1Table 1dt2Table 2

它尝试按Id加入表格,然后过滤掉具有相同Name的记录。