У меня есть следующий код, который заполняет dataTable1
и dataTable2
двумя простыми SQL-запросами, dataTableSqlJoined
заполняется из одних и тех же таблиц, но объединяется.
Я пытаюсь написать запрос LINQ, который может создать dataTableLinqJoined
, как если бы он был создан с использованием SQL. В моем примере ниже он возвращает только значения из dataTable1.
У меня есть проблема с тем, что нужно поставить в SELECT
запроса linq. Как создать новый DataRow, содержащий все столбцы из обоих DataRows. Я не буду знать точные имена столбцов/схемы запросов до времени выполнения.
sqlCommand = new SqlCommand("SELECT ID, A, B FROM Table1", sqlConnection, sqlTransaction);
sqlAdapter = new SqlDataAdapter(sqlCommand);
DataTable dataTable1 = new DataTable();
sqlAdapter.Fill(dataTable1);
sqlCommand = new SqlCommand("SELECT ID, C, D FROM Table2", sqlConnection, sqlTransaction);
sqlAdapter = new SqlDataAdapter(sqlCommand);
DataTable dataTable2 = new DataTable();
sqlAdapter.Fill(dataTable2);
sqlCommand = new SqlCommand("SELECT Table1.ID, A, B, Table2.ID, C, D FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.ID", sqlConnection, sqlTransaction);
sqlAdapter = new SqlDataAdapter(sqlCommand);
DataTable dataTableSqlJoined = new DataTable();
sqlAdapter.Fill(dataTableSqlJoined);
var dataRows =
from
dataRows1 in dataTable1.AsEnumerable()
join
dataRows2 in dataTable2.AsEnumerable()
on
dataRows1.Field<int>("ID") equals dataRows2.Field<int>("ID")
select
dataRows1; // + dataRows2;
DataTable dataTableLinqJoined = dataRows.CopyToDataTable();
Для немного больше фона, объединенный запрос очень интенсивен БД и вызывает проблемы с производительностью. Данные, возвращаемые первым запросом, довольно статичны и могут быть сильно кэшированы. Данные, возвращаемые вторым запросом, постоянно изменяются, но быстро запускаются и поэтому не нужно кэшировать. Существует также много кода, основанного на передаче объединенного DataTable, и поэтому для передачи данных в другом формате доступно не так много возможных вариантов.