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

 

作者:浪漫十一狼
在下面的例子中实现了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]});

   }

   }
}

把两个DataTable连接起来,相当于Sql的Inner Join方法的更多相关文章

  1. [datatable]两个DataTable 连接

    using System; using System.Collections.Generic; using System.Text; using System.Data; namespace Cons ...

  2. 取两个DataTable的交集,删除重复数据

    /// <summary> /// 取两个DataTable的交集,删除重复数据 /// </summary> /// <param name="sourceD ...

  3. 通过两根RS232连接两台电脑

    把RS232的有5脚那边放下面,最左边是GND,第二三是TXD和RXD,两个RS232反接,然后两个usb连接电脑就可以通信了

  4. C# 两个datatable中的数据快速比较返回交集或差集[z]

    最基本的写法无非是写多层foreach循环,数据量多了,循环的次数是乘积增长的. 这里推荐使用Except()差集.Intersect()交集,具体性能没有进行对比. 如果两个datatable的字段 ...

  5. 比较两个DataTable是否相等

    ///   <summary>        ///   比较两个DataTable内容是否相等,先是比数量,数量相等就比内容         ///   </summary> ...

  6. C# 两个datatable中的数据快速比较返回交集或差集

    转自: https://www.cnblogs.com/lacey/p/5893380.html 如果两个datatable的字段完全一致的话,可以直接使用Except,Intersect //Exc ...

  7. reportConfig.xml两种数据源连接的配置方式

     在reportConfig.xml配置文件中,我们提供了两种数据源连接的配置方式,分别如下: 1.jndi数据源配置(即:在dataSource中配置) 此配置适用于在j2ee的服务器中配置了j ...

  8. ytu 1052: 写一函数,将两个字符串连接(水题,指针练习)

    1052: 写一函数,将两个字符串连接 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 343  Solved: 210[Submit][Status][ ...

  9. c# 合并两个DataTable

    当两个DataTable 结构相同可以用自带方法(Merge)合并 // // 摘要: // 将指定的 System.Data.DataTable 与当前的 DataTable 合并,指示是否在当前的 ...

随机推荐

  1. JVM垃圾回收机制总结(1) :一些概念

    数据类型 Java虚拟机中,数据类型可以分为两类:基本类型 和引用类型 .基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本 ...

  2. k序数组排序

    这道题,已知一个数组a,a[i]排好序后位于a[i-k]跟a[i+k]之间,问说该怎么最快地排序. 可以转换成多路归并问题, a[0]<a[k+1]<a[2k+2]<a[3k+3]. ...

  3. Android开发常用代码片段

    拨打电话 public static void call(Context context, String phoneNumber) { context.startActivity( new Inten ...

  4. Android 设置闹铃步骤和基础代码

    主要分三步: 1. 设置闹铃时间; 2. 接收闹铃事件广播; 3. 重开机后重新计算并设置闹铃时间;   1. 设置闹铃时间(毫秒) private void setAlarmTime(Context ...

  5. OpenGL基础知识

    基本概念 透视(Perspective)变换(Transformation)投影矩阵(Projection Matrix):用于将3D坐标转换为2D屏幕坐标光栅化(Rasterization): 实际 ...

  6. nginx添加nginx_mod_h264_streaming-2.2.7模块编译报错

    报错ngx_http_streaming_module.c:158: 错误:‘ngx_http_request_t’ 没有名为 ‘zero_in_uri’ 的成员.这需要修改nginx_mod_h26 ...

  7. A - 畅通工程

    A - 畅通工程 Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  8. 防止SQL注入和XSS攻击Filter

    nbsp;今天系统使用IBM的安全漏洞扫描工具扫描出一堆漏洞,下面的filter主要是解决防止SQL注入和XSS攻击 一个是Filter负责将请求的request包装一下. 一个是request包装器 ...

  9. build.gradle(Project) 和 build.gradle(Module) 的区别

    参考: http://stackoverflow.com/questions/28295933/difference-between-build-gradleproject-and-build-gra ...

  10. [51NOD1181]质数中的质数(质数筛法)(欧拉筛)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1181 思路:欧拉筛出所有素数和一个数的判定,找到大于n的最小质 ...