Search on the blog

2014年6月23日月曜日

C#入門(6)DataTableをJoinする

 DataRelationを使うと、2つのDataTableを結合出来る。
例として、会社テーブルと従業員テーブルを作って、「1つの会社はN人の従業員を有する」という関係を定義してみた。
 
 僕の経験上、Javaの場合はORMでテーブルをEntityに変換するのが一般的だったけど、C#はDataTable使って永続化された情報をメモリ上で扱うのが一般的なんだろうか。慣れの問題かもしれないけど、いまいちしっくりこない。DataTable使うと、DataGridで簡単に表示出来るので便利っちゃ便利。
using System;
using System.Data;

namespace sample
{
    public class DataRelations
    {
        public static void Main(string[] args) {
            new DataRelations().Run();
        }

        public void Run() {
            DataSet ds = new DataSet();

            // 会社テーブルの定義
            ds.Tables.Add("companies");
            ds.Tables["companies"].Columns.Add("id", typeof(int));
            ds.Tables["companies"].Columns.Add("name", typeof(String));

            // 従業員テーブルの定義
            ds.Tables.Add("employees");
            ds.Tables["employees"].Columns.Add("id", typeof(int));
            ds.Tables["employees"].Columns.Add("name", typeof(String));
            ds.Tables["employees"].Columns.Add("companyId", typeof(int));

            // 会社テーブルにレコード挿入
            String[] companies = {"HAL", "ORANGE", "GIANTSOFT"};
            for (int i = 0; i < companies.Length; i++) {
                DataRow row = ds.Tables["companies"].NewRow();
                row["id"] = i + 1;
                row["name"] = companies[i];
                ds.Tables["companies"].Rows.Add(row);
            }

            // 従業員テーブルにレコード挿入
            String[] employees = {"Taro", "Hanako", "Yuta", "Kumi", "Takashi", "Naomi"};
            for (int i = 0; i < employees.Length; i++) {
                DataRow row = ds.Tables["employees"].NewRow();
                row["id"] = i + 1;
                row["name"] = employees[i];
                row["companyId"] = i % 3 + 1;
                ds.Tables["employees"].Rows.Add(row);
            }

           // 関連を定義(会社は従業員を有する)
           ds.Relations.Add("companyHasEmployees", 
                             ds.Tables["companies"].Columns["id"], 
                             ds.Tables["employees"].Columns["companyId"]
                             );

            // ある従業員が所属する会社を取得
            foreach (DataRow employee in ds.Tables["employees"].Rows) {
                DataRow company = employee.GetParentRow("companyHasEmployees");
                Console.WriteLine("{0} belongs to {1}.", employee["name"], company["name"]);
            }

            // ある会社に所属する従業員を取得
            foreach (DataRow company in ds.Tables["companies"].Rows) {
                Console.WriteLine("Employees who work for {0}:", company["name"]);
                foreach (DataRow emps in company.GetChildRows("companyHasEmployees")) {
                    Console.WriteLine("\t{0}", emps["name"]);
                }
            }
         
        }
    }
}

0 件のコメント:

コメントを投稿