在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. CentOS启动和停止服务详解

    服务简介Linux 系统服务是在Linux启 动时自动加载,并在Linux退出时自动停止的系统任务.在Linux 启动过程中,我们可以看得很多“starting … ”提示信息,该信息表示正在启动系统 ...

  2. Android 去掉title bar的3个方法

    1. Java代码实现 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstance ...

  3. css 射线实现方法

    一个斜的四边形 .top_ad_out::before { content: ''; position: absolute; z-index: -1; width: 336px; height: 25 ...

  4. MyEclipse配置Tomcat 并编写第一个JSP程序

    安装myeclipse之后配置tomcat服务器,在window里选择servers 选择tomcat的文件夹路径(我的是从别人那里考过来的文件夹) 选中上enable即可 出现了这个界面 在这里可以 ...

  5. Combiner

    如果job 设置了 combiner ,则job的每个map运行的数据会先进入combiner,然后再通过patitioner分发到reduce.通过combiner能减少reduce的计算.空间压力 ...

  6. Linux suse x86_64 环境上部署Hadoop启动失败原因分析

    一.问题症状: 在安装hadoop的时候报类似如下的错误: # A fatal error has beendetected by the Java Runtime Environment: # #  ...

  7. ado执行sql查询出现“发送数据流时出现算术溢出”错误

    开发一个数据采集监控系统,比较变态的是有将近2000项数据.根据数据类型分多个表存储.数据库访问层采用ado.最近发现当一条sql一次性查询1700多个字段数据后就出现“发送数据流时出现算术溢出”错误 ...

  8. Ubuntu 14.10下安装深度音乐客户端

    很多刚从windows系统投靠到ubuntu的机油,在听音乐时不是很舒心.毕竟ubuntu软件中心的很多影音软件都是国外的朋友编写的,所以很多时候国内的朋友用着很不舒服.今天给大家推荐的是国内开发者针 ...

  9. CF 314C Sereja and Subsequences(树状数组)

    题目链接:http://codeforces.com/problemset/problem/314/C 题意:给定一个数列a.(1)写出a的不同的所有非下降子列:(2)定义某个子列的f值为数列中各个数 ...

  10. hdu1054(二分图匹配)

    题意很简单,在一颗树上找最小点覆盖. 将树染成黑白两色,构成一张二分图,然后最大匹配==最小点覆盖即可,所以一次匈牙利就可以求出来了 hdu1054 #include <iostream> ...