2016-07-28 55 views
0

我想用LINQ來比較2個DataTables中的列的差異。兩列的類型相同(Int32),兩者的查詢是相同的,但只有一列給出了預期的結果。另一個並不總是趕上變化。它將從1到0的值的更改註冊,但忽略從0到1的值更改。下面顯示了兩條LINQ語句。不一致的LINQ結果比較數據表

這工作:

Dim result = From table1 In newTable 
       Where Not (From table2 In origTable 
        Where (table2("Ack Required") = table1("Ack Required"))).Any() 
       Select table1.ItemArray() 

這工作時,值更改爲1,但什麼都不做,當它變爲0:

Dim result2 = From table1 In newTable 
        Where Not (From table2 In origTable 
         Where (table2("Active") = table1("Active"))).Any() 
        Select table1.ItemArray() 

什麼我錯在這裏做什麼?

編輯:這是一個循環的實現,我發現,它是我想要做的事:

Public Function AreTablesTheSame(table1 As DataTable, table2 As DataTable) As Boolean 
    ' Reference - https://stackoverflow.com/questions/7517968/how-to-compare-2-datatables 

    ' If row/column count are different there is no need to look at data 
    If table1.Rows.Count <> table2.Rows.Count OrElse table1.Columns.Count <> table2.Columns.Count Then 
     Return False 
    End If 

    ' Row/column count are the same in both tables 
    ' Check each value until difference found or end of table reached 
    For i As Integer = 0 To table1.Rows.Count - 1 
     For c As Integer = 0 To table1.Columns.Count - 1 
      If Not Equals(table1.Rows(i)(c), table2.Rows(i)(c)) Then 
       Return False 

      End If 
     Next 
    Next 

    Return True 

End Function 
+0

你似乎並沒有被這兩個表上加入行任何類型的鍵比較匹配的行,所以我不確定任何一個正在做你的想法。表格中是否有某種ID字段? – Mark

+0

這很有道理。沒有ID字段。我將不得不看看數據,但我認爲兩個字段的組合會產生一個獨特的價值。 – thephez

回答

0

我覺得你的查詢可以重構爲一個單一的方法,它接受列名作爲參數。

因爲您將第二個查詢放在括號中,它將不會像您所期望的那樣工作。我不確定實際發生了什麼,但我認爲創建的表達式樹會編譯爲完全不同的東西。

如果你想比較每列的第一個表,在第二表中每一行寫的查詢,如下所示:

Function CompareTables(newTable As DataTable, origTable As DataTable, column as String) 
      As IEnumerable(Of Object()) 

     Return _ 
      From table1 In newTable 
      From table2 In origTable 
      Where (table2(column) <> table1(column)) 
      Select table1.ItemArray 

End Function 
+0

感謝您的反饋意見。我也收到了意想不到的結果。例如,將2個相同的表格與4行進行比較將返回6行結果(其中一行重複兩次)。 – thephez

+0

你期望的結果是什麼? –

+0

在相同的表格的情況下,我期待結果中沒有行(我想只得到不匹配的行)。 – thephez