C#中把两个DataTable连接起来,相当于Sql的Inner Join方法

80酷酷网    80kuku.com

  在下面的例子中实现了3个Join方法,其目的是把两个DataTable连接起来,相当于Sql的Inner Join方法,返回DataTable的所有列。 
如果两个DataTable中的DataColumn有重复的话,把第二个设置为ColumnName+"_Second",下面是代码,希望对大家有所帮助。 
using System; 
using System.Data; 

namespace WindowsApplication1 

    public class SQLOps 
    { 
        public SQLOps() 
        {             
        } 

        public static DataTable Join (DataTable First, DataTable Second, DataColumn[] FJC, DataColumn[] SJC) 

        { 

            //创建一个新的DataTable 

            DataTable table = new DataTable("Join"); 


            // Use a DataSet to leverage DataRelation 

            using(DataSet ds = new DataSet()) 

            { 

                //把DataTable Copy到DataSet中 

                ds.Tables.AddRange(new DataTable[]{First.Copy(),Second.Copy()}); 

                DataColumn[] parentcolumns = new DataColumn[FJC.Length]; 

                for(int i = 0; i < parentcolumns.Length; i++) 

                { 

                    parentcolumns[i] = ds.Tables[0].Columns[FJC[i].ColumnName]; 

                } 

                DataColumn[] childcolumns = new DataColumn[SJC.Length]; 

                for(int i = 0; i < childcolumns.Length; i++) 

                { 

                    childcolumns[i] = ds.Tables[1].Columns[SJC[i].ColumnName]; 

                } 


                //创建关联 

                DataRelation r = new DataRelation(string.Empty,parentcolumns,childcolumns,false); 

                ds.Relations.Add(r); 


                //为关联表创建列 

                for(int i = 0; i < First.Columns.Count; i++) 

                { 

                    table.Columns.Add(First.Columns[i].ColumnName, First.Columns[i].DataType); 

                } 

                for(int i = 0; i < Second.Columns.Count; i++) 

                { 

                    //看看有没有重复的列,如果有在第二个DataTable的Column的列明后加_Second 

                    if(!table.Columns.Contains(Second.Columns[i].ColumnName)) 

                        table.Columns.Add(Second.Columns[i].ColumnName, Second.Columns[i].DataType); 

                    else 

                        table.Columns.Add(Second.Columns[i].ColumnName + "_Second", Second.Columns[i].DataType); 

                } 
                

                table.BeginLoadData(); 

                foreach(DataRow firstrow in ds.Tables[0].Rows) 

                { 

                    //得到行的数据 

                    DataRow[] childrows = firstrow.GetChildRows(r); 

                    if(childrows != null && childrows.Length > 0) 

                    { 

                        object[] parentarray = firstrow.ItemArray;  

                        foreach(DataRow secondrow in childrows) 

                        { 

                            object[] secondarray = secondrow.ItemArray; 

                            object[] joinarray = new object[parentarray.Length+secondarray.Length]; 

                            Array.Copy(parentarray,0,joinarray,0,parentarray.Length); 

                            Array.Copy(secondarray,0,joinarray,parentarray.Length,secondarray.Length); 

                            table.LoadDataRow(joinarray,true); 

                        } 

                    } 

                } 

                table.EndLoadData(); 

            } 


            return table; 

        } 


        public static DataTable Join (DataTable First, DataTable Second, DataColumn FJC, DataColumn SJC) 

        { 

            return Join(First, Second, new DataColumn[]{FJC}, new DataColumn[]{SJC}); 

        } 

        public static DataTable Join (DataTable First, DataTable Second, string FJC, string SJC) 

        { 

            return Join(First, Second, new DataColumn[]{First.Columns[FJC]}, new DataColumn[]{First.Columns[SJC]}); 

        } 


    } 

分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: