닌자고양이
[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