static void Main(string[] args) { DataTable dt = GetData(); //组织父表数据
DataTable dtDetail = GetDetailData();//组织子表数据
try { string parentFieldName = "ID"; string relationFieldName = "d_ParentID"; DataTable joinDt = JoinData(dt, dtDetail, parentFieldName, relationFieldName, false);// 合并表数据 Console.Write("sucess"); } catch (Exception ex) { } }
//组织父表数据
private static DataTable GetData() { DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("ID", Type.GetType("System.Int32"))); dt.Columns.Add(new DataColumn("Code", Type.GetType("System.String"))); dt.Columns.Add(new DataColumn("Name", Type.GetType("System.String")));
DataRow dr = null; for (int i = 0; i < 10; i++) { dr = dt.NewRow(); dr["ID"] = i; dr["Code"] = i; dr["Name"] = i; dt.Rows.Add(dr); } return dt; }
//组织子表数据
private static DataTable GetDetailData() { DataTable dtDetail = new DataTable(); dtDetail.Columns.Add(new DataColumn("d_ID", Type.GetType("System.Int32"))); dtDetail.Columns.Add(new DataColumn("d_ParentID", Type.GetType("System.Int32"))); dtDetail.Columns.Add(new DataColumn("d_Code", Type.GetType("System.String"))); dtDetail.Columns.Add(new DataColumn("d_Name", Type.GetType("System.String"))); DataRow dr = null; for (int i = 0; i < 5; i++) { dr = dtDetail.NewRow(); dr["d_ID"] = 2 * i; dr["d_ParentID"] = 2 * i; dr["d_Code"] = 2 * i; dr["d_Name"] = 2 * i; dtDetail.Rows.Add(dr); }
return dtDetail; }
/// <summary> /// 合并表数据 /// </summary> /// <param name="dt">合并主表</param> /// <param name="dtDetail">合并明细表</param> /// <param name="isInnerJoin">是否内联</param> /// <returns>DataTable</returns> private static DataTable JoinData(DataTable dt, DataTable dtDetail, string parentFieldName, string relationFieldName, bool isInnerJoin) { DataTable joinDt = new DataTable();
try { using (DataSet ds = new DataSet()) { ds.Tables.AddRange(new DataTable[] { dt, dtDetail });
DataRelation relation = new DataRelation("MasterRelation", dt.Columns[parentFieldName], dtDetail.Columns[relationFieldName], false); ds.Relations.Add(relation);
for (int i = 0; i < dt.Columns.Count; i++) { joinDt.Columns.Add(dt.Columns[i].ColumnName, dt.Columns[i].DataType); } for (int i = 0; i < dtDetail.Columns.Count; i++) { joinDt.Columns.Add(dtDetail.Columns[i].ColumnName, dtDetail.Columns[i].DataType); }
joinDt.BeginLoadData(); foreach (DataRow firstrow in ds.Tables[0].Rows) { //得到行的数据 DataRow[] childrows = firstrow.GetChildRows(relation); object[] parentarray = firstrow.ItemArray; if (childrows != null && childrows.Length > 0) { foreach (DataRow childrow in childrows) { object[] childarray = childrow.ItemArray; object[] joinarray = new object[parentarray.Length + childarray.Length]; Array.Copy(parentarray, 0, joinarray, 0, parentarray.Length); Array.Copy(childarray, 0, joinarray, parentarray.Length, childarray.Length); joinDt.LoadDataRow(joinarray, true); } } else { if (!isInnerJoin) { joinDt.LoadDataRow(parentarray, true); } } } joinDt.EndLoadData(); } } catch (Exception ex) { throw ex; }
return joinDt; }