在运行时已知的字段上连接两个数据表

时间:2012-10-26 13:48:58

标签: vb.net datatable inner-join dynamic-tables

简而言之: 如何在VS仅在运行时知道的字段上加入两个数据表,我一直都知道? 有没有像

这样的解决方案
    Dim result = From t1 In dt, t2 In dt2 _  
                     Where t1.Field < DateTime > ("timestamp") = t2.Field < DateTime > ("samplestamp")  
                     Select t1, t2

这些表的名称仅在运行时已知,因为这两个表都是动态创建的。

长版:
在角落A,我有一个Historian服务器,我可以获得一些数据。该数据表示在给定时间(ses)的给定时间内创建的所有样本 在角落B我有一个SQL服务器,我也得到一些数据。此数据表示在给定时间内运行的所有批次。

项目需要在图表控件中显示这两个表。

现在为有趣的部分。只有在运行时我才能告诉哪些列可用。我不知道我会收到多少列,因为我无法判断1批运行或100运行。我所知道的是,我可以收到所有这些“数据”(我只在运行时看到)可以放入2个数据表(vb.net因为它是一个旧项目)
我“知道”例如,数据表1(角A)始终存在于第一列被命名为时间戳的表中。 (这也是我所知道的唯一专栏)
我也知道datatable2(B角)的第一列名为sampletime

所以这里倒计时:我如何能够将给定名称上的这两个数据表连接到一个华丽的数据表中,然后我将其用作图表控件的数据源。因此问题得以解决。

我试图完成这个并在SQL服务器中创建一个单独的sql表,这里的问题是我使用的服务器不喜欢事务,因此无法解决问题。

1 个答案:

答案 0 :(得分:3)

没有阅读 Longversion ,希望没有忽略某些事情:

您可以将这些表传递给一个以DataTables为参数的方法。

然后您可以使用此代码返回可重复使用的IEnumerable(Of Tuple(Of DataRow, DataRow))

Public Function getSomething(dt1 As DataTable, dt2 As DataTable) As IEnumerable(Of Tuple(Of DataRow, DataRow))
    Return From r1 In dt1
           Join r2 In dt2
            On r1.Field(Of DateTime)("timestamp") Equals r2.Field(Of DateTime)("samplestamp")
           Select Tuple.Create(r1, r2)
End Function

匿名类型不应在创建它们的方法之外使用。因此我使用了这种元组方法。您可以通过以下方式评估返回值:

Dim rowInfos = getSomething(tbl1, tbl2)
For Each rowInfo In rowInfos
    Dim row1 = rowInfo.Item1
    Dim row2 = rowInfo.Item2
    Dim timestamp = row1.Field(Of DateTime)("timestamp")
    Dim samplestamp = row2.Field(Of DateTime)("samplestamp")
Next