2017-02-09 5 views
0

Допустим, у меня есть два DataTable DT1 и dt2, добавить строку dt1 и сделать AcceptChanges, а затем dt2 = dt1.Copy и продолжить добавлять строки в dT2Как сравнить два DataTable и вернуть diffrence?

example1: -

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

example2: -

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

Если я просто изменить Вэл ue он будет возвращать то же значение, когда я использую 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

 Смежные вопросы

  • Нет связанных вопросов^_^