在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. 很赞的MathJax

    一直想在网页上放进LaTeX布局,但由于是要发布在SAE上,因此有很多的限制. 然后在这儿发现了这个好东东,MathJax,非常方便,JS直接可以外链. 通过它,我编辑了这个页面,看起来很不错哦.

  2. 别在细节上栽跟头------------mysql 字段类型详解

    也许你平时不在意,在设计数据库的时候,数字就设成int(10) 字符串就设成varchar(20)或者text 普通情况下是没有问题的,但是若不理解字段类型和长度的含义,总有一天你会在这里栽跟头, 这 ...

  3. leetcode:Intersection of Two Linked Lists(两个链表的交叉点)

    Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...

  4. java获取系统指定时间年月日

    java获取系统指定时间年月日 private String setDateTime(String falg) { Calendar c = Calendar.getInstance(); c.set ...

  5. JS生成指定长度的随机数

    /** * 生成指定长度的UUID * @param len * @param radix * @returns uuid * eg: createUUID(8, 2) "01001010& ...

  6. 基于Linux的oracle数据库管理 part5( linux启动关闭 自动启动关闭 oracle )

    主要内容 1. 数据库自动启动与关闭 数据库自动启动与关闭 - 单数据库模式 启动监听器及数据库 启动脚本: #! /bin/bash su - oracle<<EOF lsnrctl s ...

  7. jquery.datatable插件从数据库读取数据

    一.分页 分页的基本思想是根据datatable的页码及每页显示的行数,将数据从数据库分段提出,然后再填充到表格中,以达到分页的效果. 这里需要用到datatable插件的几个属性: "sE ...

  8. android 安装 出现Android Native Development Tools不能安装

    Software being installed: Android Native Development Tools 20.0.0.v201206242043-391819 (com.android. ...

  9. hihoCoder #1176 : 欧拉路·一 (简单)

    题意:给出n个岛,每个岛都有桥到达其他岛,且桥数可多可少(即使两岛有多桥),判断是否是欧拉路(即每条桥只能走一次,所有桥都能遍历1遍). 思路: 满足如下条件之一者即为欧拉路: 1.连通图,每个岛的度 ...

  10. (转)每天一个Linux命令(8): tar

    通过SSH访问服务器,难免会要用到压缩,解压缩,打包,解包等,这时候tar命令就是是必不可少的一个功能强大的工具.linux中最流行的tar是麻雀虽小,五脏俱全,功能强大. tar命令可以为linux ...