두 개의 간단한 SQL 쿼리를 사용하여 dataTable1
과 dataTable2
을 채우는 코드는 다음과 같습니다. dataTableSqlJoined
은 같은 테이블에서 채워지지만 함께 연결됩니다.LINQ와 연결된 두 개의 DataTable에서 결합 된 DataTable을 만듭니다. C#
마치 SQL을 사용하여 작성한 것처럼 dataTableLinqJoined
을 만들 수있는 LINQ 쿼리를 작성하려고합니다. 아래 예제에서는 dataTable1의 값만 반환합니다.
내가 가지고있는 문제는 linq 쿼리의 SELECT
에 무엇을 넣는 것입니다. 두 DataRow의 모든 열을 포함하는 새로운 DataRow를 어떻게 만들 수 있습니까? 런타임까지 정확한 열 이름/쿼리 스키마를 알 수 없습니다.
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();
조금 더 배경을 생각하면 통합 된 쿼리는 매우 DB 집약적이며 성능 문제를 일으키는 것입니다. 첫 번째 쿼리에서 반환 된 데이터는 상당히 정적이며 캐시를 많이 차지할 수 있습니다. 두 번째 쿼리에서 반환하는 데이터는 계속 변경되지만 실행 속도가 빠르며 따라서 캐시 할 필요가 없습니다. 또한 결합 된 DataTable의 전달에 의존하는 많은 코드가 있으므로 다른 형식으로 데이터를 전달할 때 가능한 많은 옵션이 없습니다.
한편으로는 이러한 쿼리의 성능을 절대적으로 알고있는 방법에 대해 약간 궁금해하지만, 다른 한편으로는 런타임까지 테이블 구조를 알지 못합니다. –
쿼리가 동적으로 작성됩니다. –