2012-12-11 74 views
0

我有具有相同的列,但具有不同的數據和一些時間2頁數據表的表有行共享相同的IDVB.NET LINQ加入鮮明2個表

我想加入那些表,其中的ID表2中的一些行不表1中存在

so if i the following tables 
ID Name 
1 A 
2 B 
3 C 

ID Name 
5 D 
1 A 
2 B 
3 C 

the from joining would be 

ID Name 
1 A 
2 B 
3 C 
5 D 

這裏就是我想

Dim q = From e In tbl1.AsEnumerable Join r In tbl2.AsEnumerable On e.Field(Of Integer)("id") Equals r.Field(Of Integer)("id") 

但我如何得到這個數據表

不知道
+0

@MitchWheat更新我的代碼問題 – user1590636

+0

似乎是一個UNION可能是一個更好的選擇。 http://msdn.microsoft.com/en-us/library/bb341731.aspx –

+0

@MitchWheat但仍然,我使用'AsEnumerable'使用聯合或聯接,我如何將數據轉換回數據表?? – user1590636

回答

1

LINQ是不符合DataTable工作那麼好,但你可以做這樣的事情:

Dim diff = tbl2.AsEnumerable().Except(tbl1.AsEnumerable(), New DataRowComparer()) 

Dim tbl = tbl1.Copy() 
For Each dataRow As DataRow In diff 
    tbl.ImportRow(dataRow) 
Next 

你需要創建一個IEqualityComparer定義如何比較DataRow秒。我決定僅比較他們的Id價值,但你可以以類似的方式每列比較:

Public Class DataRowComparer 
    Implements IEqualityComparer(Of DataRow) 

    Public Function Equals(ByVal x As DataRow, ByVal y As DataRow) As Boolean Implements IEqualityComparer(Of DataRow).Equals 
     Return CInt(x("Id")) = CInt(y("Id")) 
    End Function 

    Public Function GetHashCode(ByVal obj As DataRow) As Integer Implements IEqualityComparer(Of DataRow).GetHashCode 
     Return CInt(obj("Id")).GetHashCode() 
    End Function 
End Class 
+0

其實,我認爲LINQ對於使用'DataTable'來說非常合適。所提供的方法爲您提供了處理POD的所有能力。你遇到過什麼問題? –

+0

@MauriceReeves我記住它在'IEnumerable'上工作,並且如果需要'DataTable'中的結果,則需要額外的工作。 DataTable沒有相同的ToList或ToArray。 –

+0

明白了。我的意思是,我查看它的方式,調用'ToEnumerable()'然後迭代行,使用謂詞過濾等等是相當輕鬆的。有些情況下我不使用它,就像我只需要訪問一組數據一樣,我可能會放棄IEnumerable <>並直接使用該表,但在這一點上,任何迭代,特別是如果我需要加入其他數據集,我喜歡通過LINQ來完成。 –