Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

닌자고양이

[C#] LINQ 를 사용한 DataTable 의 Outter Join 본문

C# .NET

[C#] LINQ 를 사용한 DataTable 의 Outter Join

닌자고양이 2019. 10. 18. 00:06

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));
    }
Comments