DataTable表连接

public  static System.Data.DataTable TableJoin(System.Data.DataTable dt, System.Data.DataTable dtDetail, string[] parentFieldName, string[] relationFieldName, bool isInnerJoin, string relationName = "")
        {
            System.Data.DataTable joinDt = new System.Data.DataTable();

            try
            {
                using (DataSet ds = new DataSet())
                {
                    ds.Tables.AddRange(new System.Data.DataTable[] { dt, dtDetail });
                    if (string.IsNullOrEmpty(relationName))
                    {
                        relationName = Guid.NewGuid().ToString();
                    }
                    List<DataColumn> parentc = new List<DataColumn>();
                    List<DataColumn> childc = new List<DataColumn>();
                    foreach (var item in parentFieldName)
                    {
                        parentc.Add(dt.Columns[item]);
                    }
                    foreach (var item in relationFieldName)
                    {
                        childc.Add(dtDetail.Columns[item]);
                    }
                    DataRelation relation = new DataRelation(relationName, parentc.ToArray(), childc.ToArray(), 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;
        }

 

转载于:https://www.cnblogs.com/kexb/p/9236526.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值