Соедините две таблицы данных в полях, известных во время выполнения

В двух словах: как я могу объединить две таблицы данных в полях, которые VS знает только во время выполнения, а я знаю все время? Есть ли решение, подобное

    Dim result = From t1 In dt, t2 In dt2 _  
                     Where t1.Field < DateTime > ("timestamp") = t2.Field < DateTime > ("samplestamp")  
                     Select t1, t2

Имена этих таблиц известны только во время выполнения, поскольку обе таблицы создаются динамически.

Длинная версия:
В углу А у меня есть сервер Historian, откуда я получаю некоторые данные. Эти данные представляют собой все образцы, созданные за определенное время для заданных процессов.
В углу B у меня есть сервер SQL, откуда я также получаю некоторые данные. Эти данные представляют все пакеты, запущенные за указанное время.

Проекту необходимо, чтобы эти 2 таблицы отображались в элементе управления диаграммой.

Теперь самое интересное. Только во время выполнения я могу определить, какие столбцы будут доступны. Я не знаю, сколько столбцов я получу, потому что я не могу сказать, была ли запущена 1 партия или 100. Что я знаю, так это то, что я могу получить все эти «данные» (которые я вижу только во время выполнения), которые можно поместить в 2 таблицы данных (vb.net, потому что это СТАРЫЙ проект)
Я «знаю», например, что для данных 1 (угол A) всегда существует в таблице, где первый столбец имеет имя timestamp. (это также единственный столбец, который я здесь знаю)
И я также знаю, что первый столбец в datatable2 (угол B) называется sampletime

Итак, наступает обратный отсчет: как я могу соединить эти две таблицы данных с заданными именами в одну яркую таблицу данных, которую я затем использую в качестве источника данных для управления моей диаграммой. Следовательно, проблема решена.

Я попытался сделать это и создать одну таблицу sql на SQL-сервере, проблема в том, что я работаю с сервером, которому не нравятся транзакции, поэтому это не сработало.


person Schuere    schedule 26.10.2012    source источник


Ответы (1)


Не прочитав Длинную версию и, надеюсь, ничего не упустив из виду:

Вы можете передать эти таблицы методу, который принимает два параметра 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
person Tim Schmelter    schedule 26.10.2012
comment
Спасибо, Тим, за быстрый ответ. В итоге я попытался объединить две таблицы данных, и, как это ни смешно, я получаю правильные значения, которые хотел отобразить. Возможно, не самый чистый метод на данный момент (чем больше пакетов, тем больше времени требуется для загрузки (+- 3 секунды/пакет), но визуальный аспект присутствует :D В любом случае, спасибо, Робин. - person Schuere; 26.10.2012