2013-01-14 175 views
1

假設我有以下2個數據表:DataTable的錯誤 - 無法CopyToDataTable()

Table1:        Table2: 
Col1:         Col1:   Col2: 
1          1    a 
2          2    b 
2          3    c 
3          4    d 
3          5    e 
4          6    f 
             7    g 

而且我要創建基於兩個不同給予值之間的聯接第三DataTable中的一個簡單的Linq查詢 - 展望如下:

Result: 
Col1:  Col2: 
1   a 
2   b 
3   c 
4   d 

我以爲這會做到這一點:

Dim Result as DataTable = (From dr1 As DataRow In Table1.AsEnumerable 
      Join dr2 As DataRow In Table2.AsEnumerable 
      On dr1.Field(Of Double)("Col1") Equals dr2.Field(Of Double)("Col1") 
      Select New With { 
           .Col1 = dr1.Field(Of Double)("Col1"), 
           .Col2 = dr2.Field(Of String)("Col2") 
          }).Distinct.CopyToDataTable 

但我getti納克不同的錯誤的主機,無論我怎麼努力...

我的第一個錯誤是,CopyToDataTable方法不是System.Generic.IEnumerable

一員。當我刪除,並把它作爲:

Dim Result = (From dr1 As DataRow In Table1.AsEnumerable 
      Join dr2 As DataRow In Table2.AsEnumerable 
      On dr1.Field(Of Double)("Col1") Equals dr2.Field(Of Double)("Col1") 
      Select New With { 
           .Col1 = dr1.Field(Of Double)("Col1"), 
           .Col2 = dr2.Field(Of String)("Col2") 
          }).Distinct 

它運行,但它不會將結果篩選到唯一列表中 - 它將從Table1中留下所有col1值。

我想了解Linq,但我明顯錯過了一些東西 - 有人請向我解釋這是怎麼回事,以及如何解決這個問題?


作爲補充到@Magnus的解決方案,任何人誰在將來遇到這樣那樣的問題,該CopyToDataTable方法匿名類型的IEnumerable(如馬格努斯指出的是什麼,我給了這個問題)可以找到here及其實現here

回答

2

您需要將Key標識符添加到VB中Anonymous Types的屬性上。 (在C#中,所有屬性都是關鍵屬性)僅比較關鍵屬性的值,以確定兩個實例是否相等,並且您需要使用此值來使Distinct()工作。

Select New With { 
       Key .Col1 = dr1.Field(Of Double)("Col1"), 
       Key .Col2 = dr2.Field(Of String)("Col2") 
       } 

至於讓CopyToDataTable對匿名類型的工作,看看這個answer

+0

謝謝! - 重複被帶回來的第一個問題是用'Key'標識符來解決的,但是我仍然無法獲得'CopyToDataTable'去工作...... :( –

+1

'CopyToDataTable()'只能用於'IEnumerable(of DataRow )'並且你有一個匿名類型的IEnumerable。 – Magnus

+0

再一次,@Magnus,THANKS !! - 這很有道理......讓我感到困惑的是MSDN文檔,如下所示:http://msdn.microsoft.com/en -us/library/bb386921.aspx - 他們如何設法在第三個例子中做到這一點? - 我錯過了什麼嗎? –