2014-01-17 19 views
1

是否有可能創建一個MergeTables方法,如下所示,在編譯時不知道要連接的字段的字段類型?LINQ加入兩個數據表 - 在運行時定義字段類型?

Private Function MergeTables(ByVal dtA As DataTable, _ 
          ByVal dtB As DataTable, _ 
          ByVal fieldA As String, _ 
          ByVal fieldB As String, _ 
          ByVal fieldAType As ???, _ 
          ByVal fieldBType As ???) 

    Dim test = (From a In dtA.AsEnumerable() _ 
       Join b In dtB.AsEnumerable() _ 
       On a.Field(Of ???)(fieldA) _ 
       Equals b.Field(Of ???)(fieldB) _ 
      Select New With _ 
       { _ 
        'Specify fields here 
       }).ToList() 

    Return test 
End Function 

回答

2

如何使您的方法通用並傳遞Func(Of DataRow, T)而不是字符串?

Private Function MergeTables(Of T)(ByVal dtA As DataTable, _ 
         ByVal dtB As DataTable, _ 
         ByVal fieldASelector As Func(Of DataRow, T), _ 
         ByVal fieldBSelector As Func(Of DataRow, T)) 

    Dim test = (From a In dtA.AsEnumerable() _ 
       Join b In dtB.AsEnumerable() _ 
       On fieldASelector(a) _ 
       Equals fieldBSelector(b) _ 
       Select New With _ 
        { _ 
         .t = 1 
        }).ToList() 

    Return test 
End Function 

btw。從方法返回匿名類型不是一個好習慣。

調用例如

您可以使用lambda表達式來調用該方法:

MergeTables(first, second, Function(r) r.Field(Of String)("testA"), Function(r) r.Field(Of String)("testB")) 
+0

我試圖清理其中有許多LINQ查詢,只有柱略有不同類名稱和字段類型。將它們放在一邊而不是鞏固並將參數傳遞給一種方法是更好的做法嗎? – TimeBomb006

+1

重複代碼總是更好,因此是將類似方法合併爲一個是重構過程的常見部分。 – MarcinJuraszek

+0

哦,我明白你的意思了,我已經在帖子中排除了「(Of T)」。最後一個問題 - 我有點過頭了。我將如何初始化'Func(Of DataRow,T)'變量?我發現我可以創建類似'Dim test As Func(Of DataRow,String)',但我不確定如何指定該字段。我應該考慮的任何資源?謝謝你的幫助! – TimeBomb006