2017-02-09 133 views
0

可以说,我有两个数据表DT1和DT2,我添加行DT1和做的AcceptChanges,然后DT2 = dt1.Copy并继续添加行DT2如何比较两个DataTable并返回差异?

例1: -

dt1     dt2 
    ---------------  --------------- 
    | item | qty |  | item | qty | 
    ---------------  --------------- 
    | Apple | 1 |  | Apple | 1 | 
    | Orange| 1 |  | Orange| 1 | 
    ---------------  | Banana| 2 | 
          --------------- 

Dim dt_compare as DataTable = dt2.GetChanges() 

    dt_compare     
    ---------------  
    | item | qty |   
    ---------------  
    | Banana| 2 | 
    --------------- 

上述结果是我所得到的,这是我想还可以,但请拿上例题

例题一看: -

dt1     dt2 
    ---------------  --------------- 
    | item | qty |  | item | qty | 
    ---------------  --------------- 
    | Apple | 1 |  | Apple | 1 | 
    | Orange| 1 |  | Orange| 10 | 
    ---------------  --------------- 

Dim dt_compare as DataTable = dt2.GetChanges() 

    dt_compare     
    ---------------  
    | item | qty |   
    ---------------  
    | Orange| 10 | 
    --------------- 

如果我只是改变了VAL当我使用GetChanges()时,它会返回相同的值。我怎样才能得到结果9而不是10?

+1

你要求的数量有什么区别?即dt2.qty-dt2.qty?你必须自己做。 GetChanges查找数据中的绝对更改。它说“是否有区别”,然后报告是/否,并列出更改。它不知道你想要对这些数据进行什么数学运算 - 毕竟,这只是偶然,即使在数字字段上也是如此。然后,可能会有许多不同的可能计算,它应该如何知道你需要什么?但它给了你机会 - 现在你知道有一个区别,你可以做自己的计算来适应自己。 – ADyson

回答

1

你可以玩RowVersion达到你想要的。基本上,您可以检查更改是否为修改,在这种情况下,将当前值从原始值中减去。会是这样的:

Dim dat1 As DataTable = New DataTable() 
dat1.Columns.Add("item") 
dat1.Columns.Add("qty") 


dat1.Rows.Add(New Object() {"Apple", 1}) 
dat1.Rows.Add(New Object() {"Orange", 1}) 

dat1.AcceptChanges() 
dat1.Rows.Add(New Object() {"Banana", 2}) 
dat1.Rows(1)("qty") = 10 

Dim dtChanges As DataTable = dat1.GetChanges() 
For Each dr As DataRow In dtChanges.Rows 
    If dr.RowState = DataRowState.Modified Then 
     dr("qty") = Convert.ToInt16(dr("qty", DataRowVersion.Current)) - Convert.ToInt16(dr("qty", DataRowVersion.Original)) 

    End If 
Next 

使用LINQ的选择:

Dim modified = dat1.GetChanges() _ 
        .AsEnumerable() _ 
        .Where(Function(x) x.RowState = DataRowState.Modified) _ 
        .Select(Function(x) New With { 
        .Key = x("item"), 
        .Value = Convert.ToInt16(x("qty", DataRowVersion.Current)) - Convert.ToInt16(x("qty", DataRowVersion.Original))}) _ 
        .ToList() 
+0

谢谢它的作品! – vbnewbie

相关问题