【问题标题】: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);
 }

【问题讨论】:

    标签: c# asp.net linq


    【解决方案1】:

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

    DataRow 公开了一个名为 RowState 的属性,当它的一列或多列发生更改时,该属性设置为 ModifiedAcceptChanges()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);
      

      这里dt1Table 1dt2Table 2

      它尝试通过Id连接表,然后过滤掉具有相同Name的记录。

      【讨论】:

        猜你喜欢
        • 2021-07-26
        • 1970-01-01
        • 1970-01-01
        • 2015-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-22
        • 1970-01-01
        相关资源
        最近更新 更多