Programming/C#

C# DataTable의 LINQ식을 이용한 Join 방법 정리 (Datatable left Join / Inner Join)

JeongKyun 2021. 12. 28.
반응형

LINQ 구조

서론

이번 글에서는 C#에서 SQL 연결을 해서 값을 받아와 사용한다면 거의 항시 사용하게 되는

DataTable의 데이터를 가져오는 방법을 정리할 것이다.

가져오는 방법은 단일 테이블 조회 시 datatable.Select("조건")함수를 써서 값을 조회 할 수 있지만 다중 테이블 간의 키 값으로 join을 사용해야되는 경우에는 Select()로 가져오기 힘들기 때문에 LINQ식의 join을 이용한 데이터 추출 방법을 정리해본다.

 

정리할 내용은 이렇다.

 

LINQ를 활용한 JOIN 사용법 

> inner join, left join 용법을 이용한 테이블 및 변수 값 가져오기

 

 

LINQ를 활용한 JOIN 사용법

1) LINQ - Inner Join

var innerJoin = from alias_tb_a in tb_a.AsEnumerable()
                join alias_tb_b in tb_b.AsEnumerable()
                on alias_tb_a.Field<string>("A_key_column") equals alias_tb_b.Field<string>("B_key_column") into dataKey
                from alias_tb_b in dataKey
                select new
                {
                   ID = alias_tb_a.Field<string>("A_table_ID"),
                   NAME = (result_table == null ? null : result_table.Field<string>("B_key_column"))
                   ... // 위 방식처럼 변수에 값을 넣어 둘 수있음.
                };
                
// result_table : join하여 나온 결과 테이블
// alias_tb_a.Field<string>("A_table_ID") : tb_a에서의 A_table_ID 컬럼의 값

// SQL 동일식
SELECT * FROM tb_a alias_tb_a 
INNER JOIN tb_b alias_tb_b 
ON 
alias_tb_a.A_key_column = alias_tb_b.B_key_column

 

 

2) LINQ - Left Join

var leftJoin = from alias_tb_a in tb_a.AsEnumerable()
                join alias_tb_b in tb_b.AsEnumerable()
                on alias_tb_a.Field<string>("A_key_column") equals alias_tb_b.Field<string>("B_key_column") into dataKey
                from result_table in dataKey.DefaultIfEmpty()
                select new
                {
                   ID = alias_tb_a.Field<string>("A_table_ID"),
                   NAME = (result_table == null ? null : result_table.Field<string>("B_key_column"))
                   ... // 위 방식처럼 변수에 값을 넣어 둘 수있음.
                };
                
// result_table : join하여 나온 결과 테이블
// alias_tb_a.Field<string>("A_table_ID") : tb_a에서의 A_table_ID 컬럼의 값

// SQL 동일식
SELECT * FROM tb_a alias_tb_a 
LEFT JOIN tb_b alias_tb_b
ON 
alias_tb_a.A_key_column = alias_tb_b.B_key_column

 

 

3) LINQ - 1&2 방법으로 Join을 돌린 후 테이블 조회 및 값 추출 방법

string ID = "Jeongkyun";


var joinTable = from tb1 in leftJoin.AsEnumerable()
            where a.ID == ID //만약 조건 안쓰고 싶다하면 1=1로 정의
            select tb1;	

//SQL 동일 식
//: SELECT * FROM joinTable WHERE ID = 'Jeongkyun';

//위에서 ID 변수 쓰는법 예제.
int row_index= 0; //추출할 row 인덱스
string select_id = joinTable[row_index].ID.Tostring();

//join table을 Datagrdview에 넣는법
Datagridvew dgv = new Datagridview();
dgv.DataSource = joinTable.ToArray();

 

 

4) LINQ - Join하여 나온 결과 테이블을 새로운 데이터 테이블에 넣는법

IEnumerable<DataRow> result_table =
                    from alias_tb_a in tb_a.AsEnumerable()
                    join alias_tb_b in tb_b.AsEnumerable()
                    on alias_tb_a.Field<string>("A_key_column") equals alias_tb_b.Field<string>("B_key_column") into dataKey
                    from result in dataKey.DefaultIfEmpty()
                    select result_table;


DataTable dt = result_table.CopyToDataTable<DataRow>();

//위와 같이하면 dt에 join한 결과 테이블 값이 담긴다.

 

 

댓글

💲 많이 본 글