Mam następujący kod, który wypełnia dataTable1
i dataTable2
za pomocą dwóch prostych kwerend SQL, dataTableSqlJoined
jest wypełniany z tych samych tabel, ale połączone razem.Utwórz połączone DataTable z dwóch DataTables połączonych z LINQ. C#
Próbuję napisać zapytanie LINQ, które może utworzyć dataTableLinqJoined
tak, jakby zostało utworzone przy użyciu SQL. W moim przykładzie poniżej zwraca tylko wartości z dataTable1.
Problemem jest to, co umieścić w SELECT
zapytania linq. W jaki sposób mogę utworzyć nowy DataRow zawierający wszystkie kolumny z obu DataRows. Nie będę znać dokładnych nazw kolumn/schematów zapytań do czasu wykonania.
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();
Dla nieco więcej tła, kwerenda złożona jest bardzo intensywnie DB i powoduje problemy z wydajnością. Dane zwrócone przez pierwsze zapytanie są dość statyczne i mogą być silnie zbuforowane. Dane zwracane przez drugie zapytanie zmieniają się stale, ale są szybkie do uruchomienia i dlatego nie muszą być buforowane. Istnieje również wiele kodów zależnych od przejścia połączonej DataTable, a zatem nie ma zbyt wielu dostępnych opcji w przekazywaniu danych w innym formacie.
Jestem nieco ciekawy, jak z jednej strony znasz wydajność tych zapytań, ale z drugiej strony nie znasz struktury tabeli przed uruchomieniem. –
Zapytania są budowane dynamicznie. –