Страницы

Поиск по вопросам

вторник, 26 февраля 2019 г.

Аналог в LINQ для SELECT * FROM table1 INNER JOIN table2

Есть два объекта DataTable datatable1 и datatable2. Как получить на выходе результат LINQ запроса аналогичный SQL-ному SELECT * FROM table1 INNER JOIN table2 ON condition в новом объекте DataTable? Как делать сам INNER JOIN и даже OUTER JOIN ясно.
from table1 in datatable1.AsEnumerable() join table2 in datatable2.AsEnumerable() on (int)table1["anID"] equals (int)table2["anID"] select new { A = (int)table1["A"], B = (int)table1["B"], C = (int)table2["C"], D = (int)table2["D"] };
А вот как получить результат в новом DataTable, не перечисляя при этом поля пример не попадается.
P.S. Вопрос не о работе с БД, а о возможностях c# + linq


Ответ

Так как нужна именно DataTable, то первоначально нужно создать ее и добавить колонки. Судя из вопроса вы хотите добавить все колонки из первой таблицы и из второй. Для этого можно воспользоваться следующим кодом.
DataTable table = new DataTable();
foreach(DataColumn column in table1.Columns){ table.Columns.Add("table1_"+column.ColumnName, column.DataType) } foreach(DataColumn column in table2.Columns){ table.Columns.Add("table2_"+column.ColumnName, column.DataType) }
Теперь в новой таблице колонки из обеих таблиц и можно добавлять строки.
var rows = from table1 in datatable1.AsEnumerable() join table2 in datatable2.AsEnumerable() on (int)table1["anID"] equals (int)table2["anID"] select table1.itemArray.Concat(table2.itemArray);
Получили список массивов которые можно добавлять в DataTable.
foreach(var row in rows){ table.Rows.Add(row); }
В итоге получили table со всеми нужными строками.

Комментариев нет:

Отправить комментарий