Вы уже смотрели эту страницу?
КАК: реализовать вспомогательный класс DataSet JOIN в Visual C # .NET
Если вам не подходит этот подход LINQy, вы можете разбить данные строки на массивы объектов:
DataTable targetTable = dataTable1.Clone();
var dt2Columns = dataTable2.Columns.OfType<DataColumn>().Select(dc =>
new DataColumn(dc.ColumnName, dc.DataType, dc.Expression, dc.ColumnMapping));
targetTable.Columns.AddRange(dt2Columns.ToArray());
var rowData =
from row1 in dataTable1.AsEnumerable()
join row2 in dataTable2.AsEnumerable()
on row1.Field<int>("ID") equals row2.Field<int>("ID")
select row1.ItemArray.Concat(row2.ItemArray).ToArray();
foreach (object[] values in rowData)
targetTable.Rows.Add(values);
Я думаю, что это примерно так же кратко, как вы сможете это сделать, и я объясню почему: это схема.
A DataRow
не является самостоятельным объектом; оно зависит от его владения DataTable
и не может жить без него. нет поддерживаемого способа для создания "отключенного" DataRow
; метод расширения CopyToDataTable()
работает со строками, которые уже существуют в одном DataTable
, и просто копирует схему из источника (помните, что каждый DataRow
имеет ссылку на своего родителя Table
) перед копированием самих строк (скорее всего используя ImportRow
, хотя я на самом деле не открыл Reflector для проверки).
В этом случае у вас есть новая схема, которую вам нужно создать. Прежде чем вы сможете создать какие-либо (новые) строки, вам нужно создать таблицу, в которой они будут храниться first , и это означает написание как минимум 3 строк кода в верхней части метода, описанного выше.
Затем вы можете, наконец, создать строки - но только по одной за раз, поскольку DataTable
и связанные с ним DataRowCollection
не предоставляют никаких методов для добавления нескольких строк одновременно. Вы можете, конечно, добавить свой собственный метод расширения для DataRowCollection
, чтобы сделать этот «внешний вид» более приятным:
public static void AddRange(this DataRowCollection rc,
IEnumerable<object[]> tuples)
{
foreach (object[] data in tuples)
rc.Add(tuples);
}
Тогда вы можете избавиться от foreach
в первом методе и заменить его на:
targetTable.Rows.AddRange(rowData);
Хотя это на самом деле просто движет многословием, а не устраняет его.
Итог, пока вы работаете с унаследованной иерархией классов DataSet
, всегда будет небольшая путаница. Расширения Linq to DataSet хороши, но они являются только расширениями и не могут изменить вышеуказанные ограничения.