Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较datatable并返回有更改的行_C#_Asp.net_Linq - Fatal编程技术网

C# 比较datatable并返回有更改的行

C# 比较datatable并返回有更改的行,c#,asp.net,linq,C#,Asp.net,Linq,我试图比较两个datatable并只返回有更改的行。在下面的代码中,我将dt2克隆到dt3中,但它不会选择带有更改的行,而是将所有内容都放在其中。请建议一些选择 即使修改了单个单元格的值,我也需要选择该行。每次比较时,具有的两个datatable都具有相同的行和列集 Table 1 Table 2 ID Name ID Name 1 Mark 1 Mark 2 Spencer

我试图比较两个datatable并只返回有更改的行。在下面的代码中,我将dt2克隆到dt3中,但它不会选择带有更改的行,而是将所有内容都放在其中。请建议一些选择

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

 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);
 }
代码:

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

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

DataRow
公开名为
RowState
的属性,该属性在一列或多列更改时设置为
Modified
AcceptChanges()
RejectChanges()
将此标志重置回未修改的

您甚至可以通过调用
DataRow
的索引器,将第二个参数(
RowVersion
)分别设置为
original
current
)来获取列的原始值(Ryan在您的例子中)和当前值(George在您的例子中)

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
表1
dt2
表2

它尝试通过
Id
连接表,然后过滤出具有相同
名称的记录