2012-10-26 52 views
1

简而言之: 如何在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服务器,我也可以获取一些数据。该数据代表在给定时间内运行的所有批次。

该项目需要将这2个表格显示在图表控件中。

现在的乐趣部分。只有在运行时,我才能知道哪些列将可用。我不知道我会收到多少列,因为我不知道是1批次还是100批次。我所知道的是,我可以将所有这些“数据”(我只能在运行时看到)接收到2个数据表中(因为它是一个旧项目)
我“知道”例如对于数据表1 (角落A)始终存在于第一列名为timestamp的表中。 (这也是我知道这里的唯一列)
,我也知道,在datatable2(角B)第一列被命名为sampletime

所以来这里的倒计时:我怎么能这两个数据表连接上给一个华丽的数据表名称,然后我用它作为我的图表控件的数据源。因此问题解决了。

我试图做到这一点,并在SQL服务器中创建一个单一的SQL表,这里的问题是,我与一个不喜欢事务的服务器一起工作,所以没有成功。

回答

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 
+0

感谢蒂姆的快速反应 我在尝试2个数据表的合并结束了,有趣的是,我得到我想要的,以显示正确的值。也许不是目前最干净的方法(批次越多,加载的时间越多(+ - 3秒/批次),但视觉方面存在:D无论如何Robin – Schuere

相关问题