DataTable간 Join하는 방법입니다.
소스 보시면 쉽게 이해가 가능 하 실 겁니다.
DataGridView를 통해서 최종 결과를 뿌려줍니다.
UI디자인에서 미리 만들어 놓으시기 바랍니다.
그럼 소스는…
DataTable dtUser = new DataTable();
DataTable dtDept = new DataTable();
DataTable dtUserInfo = null;
DataRow drTemp;
//사용자 정보 테이블 - DataTable Column을 추가(Range)
dtUser.Columns.AddRange(new DataColumn[] { 
		new DataColumn {ColumnName = "no", Caption = "Increment", DataType = typeof(int), Unique = true, AutoIncrement = true}
		, new DataColumn {ColumnName = "user_id", Caption = "User ID", DataType = typeof(string), Unique = true, AllowDBNull = false}
		, new DataColumn {ColumnName = "user_name", Caption = "User Name", DataType = typeof(string), AllowDBNull = false}
		, new DataColumn {ColumnName = "dept_no", Caption = "Dept. Code", DataType = typeof(int), DefaultValue = -1}
		, new DataColumn {ColumnName = "is_use", Caption = "IS Use?", DataType = typeof(bool), DefaultValue = true}
	});

/*
 * BEGIN DataRow를 이용한 사용자 정보 추가
 * */
drTemp = dtUser.NewRow();
//AutoIncrement가 0부터 시작하므로 처음값만 1로 강제 부여
drTemp["no"] = 1;
drTemp["user_id"] = "test1";
drTemp["user_name"] = "Tester 1";
drTemp["dept_no"] = 1;
drTemp["is_use"] = true;
dtUser.Rows.Add(drTemp);

drTemp = dtUser.NewRow();
drTemp["user_id"] = "test2";
drTemp["user_name"] = "Tester 2";
drTemp["dept_no"] = 100;
dtUser.Rows.Add(drTemp);

drTemp = dtUser.NewRow();
drTemp["user_id"] = "test3";
drTemp["user_name"] = "Tester 3";
drTemp["dept_no"] = 3;
drTemp["is_use"] = false;
dtUser.Rows.Add(drTemp);

drTemp = dtUser.NewRow();
drTemp["user_id"] = "test4";
drTemp["user_name"] = "Tester 4";
dtUser.Rows.Add(drTemp);
/*
 * END DataRow를 이용한 사용자 정보 추가
 * */

//부서 정보 테이블 - DataTable Column을 추가(Range)
dtDept.Columns.AddRange(new DataColumn[] {
		new DataColumn {ColumnName = "dept_no", Caption = "Dept. Code", DataType = typeof(int), Unique = true, AutoIncrement = true}
		, new DataColumn {ColumnName = "dept_name", Caption = "Dept. Name", DataType = typeof(string), DefaultValue = string.Empty, AllowDBNull = true}
	});

/*
 * BEGIN DataRow를 이용한 부서 정보 추가
 * */
drTemp = dtDept.NewRow();
//AutoIncrement가 0부터 시작하므로 처음값만 1로 강제 부여
drTemp["dept_no"] = 1;
drTemp["dept_name"] = "IT Team";
dtDept.Rows.Add(drTemp);

drTemp = dtDept.NewRow();
drTemp["dept_name"] = "Management Team";
dtDept.Rows.Add(drTemp);

drTemp = dtDept.NewRow();
drTemp["dept_name"] = "Project Management Team";
dtDept.Rows.Add(drTemp);
/*
 * END DataRow를 이용한 부서 정보 추가
 * */

/*
 * BEGIN JOIN 이후 DataView등에 사용할 최종 사용자 정보 DataTable 설정
 * */
//기존 사용자 정보 테이블 구조 및 스키마만 복사(데이터는 복사하지 않음)
dtUserInfo = dtUser.Clone();
//Join으로 추가할 부서 테이블에서 부서명에 해당되는 컬럼 추가
dtUserInfo.Columns.Add(new DataColumn { ColumnName = "dept_name", Caption = "Dept. Name", DataType = typeof(string), DefaultValue = string.Empty, AllowDBNull = true });
//Join 성공 여부 컬럼 추가
dtUserInfo.Columns.Add("is_join_dept", typeof(bool));
/*
 * END JOIN 이후 DataView등에 사용할 최종 사용자 정보 DataTable 설정 
 * */

/*
 * BEGIN 사용자 테이블과 부서 테이블간 JOIN후 최종 사용자 정보 DataTable에 반영
 * */
//var : Variable의 약자, C# 3.0부터 추가된 타입이 없는 변수, 초기에 대입되는 값에 의하여 변수의 형식이 결정 됨(int, string, double ... 등 활용 가능)
//      여기서는 IEnumerable타입으로 이용
var query =
			from u in dtUser.AsEnumerable()
			join d in dtDept.AsEnumerable()
				//on (int)o["area_index_no"] equals (int)(decimal)e["area_index_no"] into j
			on
				u["dept_no"] equals d["dept_no"]
			into j
			from jList in j.DefaultIfEmpty()
			select new
			{
				no = u["no"]
				,
				user_id = u["user_id"].ToString()
				,
				user_name = u["user_name"].ToString()
				,
				dept_no = u["dept_no"]
				,
				dept_name = (jList != null ? jList["dept_name"] : string.Empty)
				,
				is_use = Convert.ToBoolean(u["is_use"])
				,
				is_join_dept = (bool)(jList == null ? true : false)
			};

foreach (var v in query)
{
	drTemp = dtUserInfo.NewRow();
	drTemp.BeginEdit(); //생략가능
	drTemp["no"] = v.no;
	drTemp["user_id"] = v.user_id;
	drTemp["user_name"] = v.user_name;
	drTemp["dept_no"] = v.dept_no;
	drTemp["dept_name"] = v.dept_name;
	drTemp["is_use"] = v.is_use;
	drTemp["is_join_dept"] = v.is_join_dept;
	drTemp.EndEdit(); //생략가능
	dtUserInfo.Rows.Add(drTemp);
}
/*
 * END 사용자 테이블과 부서 테이블간 JOIN후 최종 사용자 정보 DataTable에 반영
 * */

//DataGridView에 반영
dataGridView1.DataSource = dtUser;
dataGridView2.DataSource = dtDept;
dataGridView3.DataSource = dtUserInfo;

출처 : 자작(userpark)

+ Recent posts