닌자고양이
[C#] LINQ 를 사용한 DataTable 의 Outter Join 본문
LINQ 의 query 구문은 쓰고 싶지 않지만 join 문 같은 경우 Enumerable Method 로만 코딩하기는 너무 복잡하므로 쿼리를 사용해 본다.
void AddRow(DataTable dt, params object[] cols)
{
DataRow row = dt.NewRow();
for (int i = 1; i <= cols.Length; i++)
row["Column" + i] = cols[i - 1];
dt.Rows.Add(row);
}
DataTable dt1 = new DataTable();
DataTable dt2 = new DataTable();
DataTable dt3 = new DataTable();
for (int i = 1; i <= 3; i++)
dt1.Columns.Add("Column" + i);
for (int i = 1; i <= 3; i++)
dt2.Columns.Add("Column" + i);
for (int i = 1; i <= 5; i++)
dt3.Columns.Add("Column" + i);
AddRow(dt1, "Dev", "Dev_A", "AAA");
AddRow(dt1, "Dev", "Dev_A", "BBB");
AddRow(dt1, "Dev", "Dev_A", "CCC");
AddRow(dt1, "Dev", "Dev_A", "DDD");
AddRow(dt2, "AAA", "1", "1");
AddRow(dt2, "AAA", "1", "2");
AddRow(dt2, "AAA", "11", "3");
AddRow(dt2, "BBB", "11", "11");
AddRow(dt2, "BBB", "11", "22");
AddRow(dt2, "CCC", "111", "222");
AddRow(dt2, "CCC", "111", "333");
// AddRow(dt2, "DDD", "1111", "1111"); DDD를 누락시켜 outter join 후 null 되는지 테스트
// 여기까지 데이터 테이블에 샘플 행을 준비
var rr = from t1 in dt1.AsEnumerable()
join t2 in dt2.AsEnumerable() on t1["Column3"] equals t2["Column1"] into t2
from t3 in t2.DefaultIfEmpty()
select new [] { t1["Column1"], t1["Column2"], t1["Column3"], t3?["Column2"], t3?["Column3"] }; // 결과 열 선택
foreach (var r in rr)
{
AddRow(dt3, r[0], r[1], r[1], r[1]); // 결과 DataTable 에 추가
Console.WriteLine(string.Join(" , ", r));
}
'C# .NET' 카테고리의 다른 글
[.NET Core/.NET 5] 단일 실행 파일로 배포하기 (0) | 2021.03.01 |
---|---|
[C#] 문자열을 특정 길이(chunk size)로 쪼개기 (0) | 2020.09.18 |
[C#] C#에서 C언어의 printf, scanf, getch 사용하기 (0) | 2020.06.25 |
[C#] 시간 범위 겹침 여부 체크 (0) | 2020.02.19 |
Comments