Объедините несколько DataTables с DataRelations в новый DataTable - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть набор данных с несколькими таблицами (количество таблиц может отличаться, как и имена и структура таблиц).Я хотел бы получить новую таблицу с объединением ранее существующих таблиц, объединяя как столбцы, так и строки.

Набор данных загружается из файла XML с:

DataSet dsXML = new DataSet();
dsXML.ReadXml(strXMLPath);

Файлы XML создаются с помощью Oracle Reports 6i, и у нас есть несколько отчетов с разными структурами, поэтому файл XML может быть проанализированк одной или нескольким таблицам.Если вы открываете XML-файл в Microsoft Excel, его данные «волшебным образом» объединяются в одну таблицу, и я хотел бы достичь того же результата автоматически, без каких-либо действий пользователя и без необходимости установки Office.

Мне удалось перебрать DataRelations набора данных и собрать все интересующие меня столбцы (все столбцы, кроме соединенных столбцов, которые дублируются в родительских и дочерних таблицах, и я получаю только один из них).):

bool blnContinue = true;
DataTable table = ds.Tables[0];
List<DataColumn> allColumns = new List<DataColumn>();
while (blnContinue)
{
    foreach (DataColumn col in table.Columns)
    {
        if (table.ParentRelations != null 
            && table.ParentRelations.Count > 0)
        {
            if (!table.ParentRelations[0].ChildColumns.Contains(col))
                allColumns.Add(col);
        }
        else
        {
            allColumns.Add(col);
        }
    }
    if (table.ChildRelations != null && table.ChildRelations.Count > 0)
        table = table.ChildRelations[0].ChildTable;
    else blnContinue = false;
}

Поскольку столбцы тесно связаны со своими таблицами, мне придется перебирать объект allColumns, чтобы создать новые столбцы с одинаковыми именами (все столбцы создаются с типом данных строки).И после создания новых столбцов повторите итерацию по Dataset и Datarelations, чтобы получить все данные.

Я пробовал с

var tablesJoined = from t1 in ds.Tables[0].Rows.Cast<DataRow>()
                   join t2 in ds.Tables[1].Rows.Cast<DataRow>() on t1["key_column"] equals t2["key_column"]
                   select new { t1, t2 };

И прочитал этот вопрос ,Но я недостаточно знаю Linq и не знаю, как динамически создать предложение, чтобы его можно было использовать с любым количеством таблиц.Кроме того, «key_column» может варьироваться, поэтому мне нужно установить его динамически, в зависимости от имеющихся у меня таблиц.

Пример того, как может быть XML-файл:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Generated by Oracle Reports version 6.0.8.11.3 -->
<SOME_ROOT_LABEL>
  <BEGIN_LIST_LABEL>
    <RECORD_LABEL>
      <PROPERTY_LABEL1>XXX</PROPERTY_LABEL1>
      <PROPERTY_LABEL2>YYY</PROPERTY_LABEL2>
      <PROPERTY_LABEL3>ZZZ</PROPERTY_LABEL3>
        ...
    </RECORD_LABEL>
    ...
    <RECORD_LABEL>
        ...
    </RECORD_LABEL>
  </BEGIN_LIST_LABEL>
  <SOME_OTHER_LABEL> whatever </SOME_OTHER_LABEL>
</SOME_ROOT_LABEL>

После того, как вседанных в один DataTable. Я хочу создать файл «.xlsx» (возможно, с использованием Epplus).

Есть ли лучший способ добиться этого (объединить N DataTables с DataRelations в один).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...