Ваш linq вообще не возвращает DataRow
;он возвращает анонимный кортеж из двух DataRows
.(Или, точнее, Enumarable
)
Я не думаю, что вы можете создать новый DataRow
из этого простым (или не очень простым) linq.
Вместо этого вам нужно будет создать строки из нового DataTable
( после создания этой таблицы) и затем заполнить поля одно за другим.
Причина в том, что DataRow не имеет значимого конструктора.
Чтобы создать DataRow
, вам всегда нужен DataTable
;тогда можно написать функцию:
DataRow MergeRows(DataTable dt, DataRow row1, DataRow row2)
{
var row3 = dt.NewRow();
for (int i = 0; i < row1.ItemArray.Length; i++)
{
row3.SetField(i, row1.ItemArray[i]);
}
int colCount1 = row1.ItemArray.Length;
for (int i = 0; i < row2.ItemArray.Length; i++)
{
row3.SetField(i + colCount1 , row2.ItemArray[i]);
}
return row3;
}
Предполагается, что поля будут совпадать.
Для создания 3-го DataTable
просто добавьте все столбцы;Есть способы использовать DataTable.Merge()
, но, вероятно, проще использовать небольшую вспомогательную функцию:
List<DataColumn> MergeColumns(DataTable dt1, DataTable dt2)
{
var cols = new List<DataColumn>();
foreach (DataColumn c in dt1.Columns) cols.Add(new DataColumn(c.ColumnName, c.DataType));
foreach (DataColumn c in dt2.Columns) cols.Add(new DataColumn(c.ColumnName, c.DataType));
return cols;
}
И добавить результат:
table3.Columns.AddRange(MergeColumns(table1, table2).ToArray());
Теперь ваш linq можно изменить на
var result = (from t1 in table1.AsEnumerable()
join t2 in table2.AsEnumerable()
on table1.Rows.IndexOf(t1) equals table2.Rows.IndexOf(t2)
select MergeRows(table3, t1, t2) );
Теперь вы можете создать 3-й DataTable
(снова!) Из строк:
if (result.Count() > 0)
table3 = result.Cast<DataRow>().ToArray().CopyToDataTable();