[英]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.