簡體   English   中英

如何比較兩個DataTable並返回差異?

[英]How to compare two DataTable and return the diffrence?

假設我有兩個DataTable dt1和dt2,我將行添加到dt1並執行AcceptChanges,然后dt2 = dt1.Copy並繼續將行添加到dt2

范例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  |
    ---------------

上面的結果是我得到的,也是我想要的,但是請看一下Example2

范例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 |
    ---------------

如果我只是更改該值,則在使用GetChanges()時它將返回相同的值。 如何獲得結果9而不是10?

您可以與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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM