LINQ加入两个DataTables - 在运行时定义字段类型?

时间:2014-01-17 19:58:14

标签: vb.net linq

是否可以创建一个MergeTables方法,如下所示,在编译时不知道要连接的字段的字段类型?

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

1 个答案:

答案 0 :(得分: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

顺便说一句。从方法返回匿名类型不是一个好习惯。

致电示例

您可以使用lambda表达式来调用该方法:

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