На этот вопрос, вероятно, ответили где-то еще, но я еще не нашел работающего решения.
У меня есть две таблицы данных, и я хочу объединить их в одну таблицу данных, содержащую все данные из них обоих или, по крайней мере, из первого из них и несколько столбцов из второго источника данных.
Я не хочу перечислять все столбцы (всего 180) из первого набора данных. Я пробовал например. это
var JoinedResult = from t1 in table1.Rows.Cast<DataRow>()
join t2 in table2.Rows.Cast<DataRow>()
on Convert.ToInt32(t1.Field<string>("ProductID")) equals t2.Field<int>("FuelId")
select t1;
но это дает только столбцы из таблицы1. Как получить столбцы из table2 тоже к моему результату? Наконец, мне нужно добавить свой результат в набор данных.
ResultSet.Tables.Add(JoinedResult.CopyToDataTable());
EDIT:
Я остановился на этом как на решении.
Это следует примеру, приведенному здесь Создание объединения с помощью Выбрать все (выбрать *) в linq для наборов данных
DataTable dtProduct = dsProduct.Tables[0];
DataTable dtMoistureLimits = ds.Tables[0];
//clone dt1, copies all the columns to newTable
DataTable dtProductWithMoistureLimits = dtProduct.Clone();
//copies all the columns from dt2 to newTable
foreach (DataColumn c in dtMoistureLimits.Columns)
dtProductWithMoistureLimits.Columns.Add(c.ColumnName, c.DataType);
var ProductsJoinedWithMoistureLimits = dtProduct.Rows.Cast<DataRow>()
.Join(dtMoistureLimits.Rows.Cast<DataRow>(),// join table1 and table2
t1 => new { ProductID = t1.Field<int>("ProductID"), DelivererID = t1.Field<int>("DelivererID") },
t2 => new { ProductID = t2.Field<int>("MoistureLimits_ProductID"), DelivererID = t2.Field<int>("MoistureLimits_DelivererID") },
(t1, t2) => // when they match
{ // make a new object
// containing the matching t1 and t2
DataRow row = dtProductWithMoistureLimits.NewRow();
row.ItemArray = t1.ItemArray.Concat(t2.ItemArray).ToArray();
dtProductWithMoistureLimits.Rows.Add(row);
return row;
});
Однако в dtMoistureLimits нет строк для всех "ProductID" и "DelivererID" в dtProduct . В настоящее время мое решение возвращает только совпадающие строки.
Как улучшить решение, чтобы оно возвращало также те строки, в которых нет данных для "ProductID" и "DelivererID" в dtMoistureLimits ?