比较数据表并返回有变化的行
Posted
技术标签:
【中文标题】比较数据表并返回有变化的行【英文标题】:Compare datatable and return rows with changes 【发布时间】:2015-04-24 11:31:26 【问题描述】:我正在尝试比较两个数据表并仅返回有变化的行。在下面的代码中,我将 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
代码:
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);
【问题讨论】:
【参考方案1】:为此,您不需要两个表。只需在第二个 DataTable
上调用 GetChanges()
即可获得更改的最后一行。确保您没有(直接或间接)在DataTable
上调用AcceptChanges()
,否则GetChanges()
将不会返回任何内容。
DataRow
公开了一个名为 RowState
的属性,当它的一列或多列发生更改时,该属性设置为 Modified
。 AcceptChanges()
和 RejectChanges()
将此标志重置回 Unmodified
。
您甚至可以通过调用DataRow
的索引器并将第二个参数(RowVersion
)设置为Original
来获取列的原始值(在您的情况下为Ryan)和当前值(在您的情况下为George)和Current
。
【讨论】:
【参考方案2】:试试这个:
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);
这里dt1
是Table 1
而dt2
是Table 2
。
它尝试通过Id
连接表,然后过滤掉具有相同Name
的记录。
【讨论】:
以上是关于比较数据表并返回有变化的行的主要内容,如果未能解决你的问题,请参考以下文章