У меня есть набор данных с несколькими таблицами (количество таблиц может отличаться, как и имена и структура таблиц).Я хотел бы получить новую таблицу с объединением ранее существующих таблиц, объединяя как столбцы, так и строки.
Набор данных загружается из файла 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 в один).