Join two DataTables in C#
- var query = (from x in a.AsEnumerable()
- join y in b.AsEnumerable() on x.Field<int>("col1") equals y.Field<int>("col1")
- select new { col1= y.Field<int>("col1"), col2=x.Field<int>("col2") }).ToList();
DataTableHelper
- public static class DataTableHelper
- {
- public enum JoinType
- {
- /// <summary>
- /// Same as regular join. Inner join produces only the set of records that match in both Table A and Table B.
- /// </summary>
- Inner = ,
- /// <summary>
- /// Same as Left Outer join. Left outer join produces a complete set of records from Table A, with the matching records (where available) in Table B. If there is no match, the right side will contain null.
- /// </summary>
- Left =
- }
- /// <summary>
- /// Joins the passed in DataTables on the colToJoinOn.
- /// <para>Returns an appropriate DataTable with zero rows if the colToJoinOn does not exist in both tables.</para>
- /// </summary>
- /// <param name="dtblLeft"></param>
- /// <param name="dtblRight"></param>
- /// <param name="colToJoinOn"></param>
- /// <param name="joinType"></param>
- /// <returns></returns>
- /// <remarks>
- /// <para>http://stackoverflow.com/questions/2379747/create-combined-datatable-from-two-datatables-joined-with-linq-c-sharp?rq=1</para>
- /// <para>http://msdn.microsoft.com/en-us/library/vstudio/bb397895.aspx</para>
- /// <para>http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html</para>
- /// <para>http://stackoverflow.com/questions/406294/left-join-and-left-outer-join-in-sql-server</para>
- /// </remarks>
- public static DataTable JoinTwoDataTablesOnOneColumn(DataTable dtblLeft, DataTable dtblRight, string colToJoinOn, JoinType joinType)
- {
- //Change column name to a temp name so the LINQ for getting row data will work properly.
- string strTempColName = colToJoinOn + "_2";
- if (dtblRight.Columns.Contains(colToJoinOn))
- dtblRight.Columns[colToJoinOn].ColumnName = strTempColName;
- //Get columns from dtblLeft
- DataTable dtblResult = dtblLeft.Clone();
- //Get columns from dtblRight
- var dt2Columns = dtblRight.Columns.OfType<DataColumn>().Select(dc => new DataColumn(dc.ColumnName, dc.DataType, dc.Expression, dc.ColumnMapping));
- //Get columns from dtblRight that are not in dtblLeft
- var dt2FinalColumns = from dc in dt2Columns.AsEnumerable()
- where !dtblResult.Columns.Contains(dc.ColumnName)
- select dc;
- //Add the rest of the columns to dtblResult
- dtblResult.Columns.AddRange(dt2FinalColumns.ToArray());
- //No reason to continue if the colToJoinOn does not exist in both DataTables.
- if (!dtblLeft.Columns.Contains(colToJoinOn) || (!dtblRight.Columns.Contains(colToJoinOn) && !dtblRight.Columns.Contains(strTempColName)))
- {
- if (!dtblResult.Columns.Contains(colToJoinOn))
- dtblResult.Columns.Add(colToJoinOn);
- return dtblResult;
- }
- switch (joinType)
- {
- default:
- case JoinType.Inner:
- #region Inner
- //get row data
- //To use the DataTable.AsEnumerable() extension method you need to add a reference to the System.Data.DataSetExtension assembly in your project.
- var rowDataLeftInner = from rowLeft in dtblLeft.AsEnumerable()
- join rowRight in dtblRight.AsEnumerable() on rowLeft[colToJoinOn] equals rowRight[strTempColName]
- select rowLeft.ItemArray.Concat(rowRight.ItemArray).ToArray();
- //Add row data to dtblResult
- foreach (object[] values in rowDataLeftInner)
- dtblResult.Rows.Add(values);
- #endregion
- break;
- case JoinType.Left:
- #region Left
- var rowDataLeftOuter = from rowLeft in dtblLeft.AsEnumerable()
- join rowRight in dtblRight.AsEnumerable() on rowLeft[colToJoinOn] equals rowRight[strTempColName] into gj
- from subRight in gj.DefaultIfEmpty()
- select rowLeft.ItemArray.Concat((subRight== null) ? (dtblRight.NewRow().ItemArray) :subRight.ItemArray).ToArray();
- //Add row data to dtblResult
- foreach (object[] values in rowDataLeftOuter)
- dtblResult.Rows.Add(values);
- #endregion
- break;
- }
- //Change column name back to original
- dtblRight.Columns[strTempColName].ColumnName = colToJoinOn;
- //Remove extra column from result
- dtblResult.Columns.Remove(strTempColName);
- return dtblResult;
- }
- }
Join two DataTables in C#的更多相关文章
- datatables增删改查的实现
学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/20069 ...
- JQuery Datatables服务器端处理示例
HTML <table class="table table-striped table-bordered table-hover" id="table_repor ...
- jquery dataTables.min.js API
demo: http://datatables.net/release-datatables/examples/api/select_single_row.html 选择一行http://datata ...
- Jquery Datatables 请求参数及接收参数处理
Jquery Datatables 请求参数及接收参数处理 /** * Created by wb-wuyifu on 2016/8/9. */ /** * Created by wb-wuyifu ...
- JQuery插件datatables相关api
学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/20069 ...
- jquery datatables api (转)
学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/20069 ...
- 最全的jquery datatables api 使用详解
学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/20069 ...
- jquery datatables api
原文地址 学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/ ...
- SQL Server-聚焦IN VS EXISTS VS JOIN性能分析(十九)
前言 本节我们开始讲讲这一系列性能比较的终极篇IN VS EXISTS VS JOIN的性能分析,前面系列有人一直在说场景不够,这里我们结合查询索引列.非索引列.查询小表.查询大表来综合分析,简短的内 ...
随机推荐
- 项目中 poi 导出 出现html特殊符号的实体 (已解决)
导出excel 时出现 类似这样的> 符号 , 大概是存到数据库也是这样,然后jsp解析可以解析出来,但是java不认得,需要个人写出解析方法. 废话不说,贴码: /** *转换html特殊符 ...
- Eclipse利用Axis2插件构建Web Service并测试
在学习Web Service的时候,从网上找到前辈的博客http://www.cnblogs.com/hexinlin/p/3358558.html,并依此文的方法按部就班:编写欲发布的java类He ...
- Chapter 3.GDI/DirectDraw Internal Data Structures
说明,在这里决定跳过第二章,实在是因为里面涉及的内容太理论,对我而言又太艰深 3.1 HANDLES AND OBJECT-ORIRNTED PROGRAMMING In normal object- ...
- SDK截图程序(一)
程序将系统窗口左上角100*100的图像复制到粘贴板上.程序的关键位置上加上了注释,相关知识<windows程序设计>第14章内容 #include <windows.h> # ...
- Cocos2d-x win7 + vs2010 配置图文详解
Cocos2d-x win7 + vs2010 配置图文详解 下载最新版的cocos2d-x.打开浏览器,输入cocos2d-x.org,然后选择Download,本教程写作时最新版本为cocos2d ...
- OpenGL阴影,Shadow Mapping(附源程序)
实验平台:Win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): 本文描述图形学的两个最常用的阴影技术之一,Shadow Mapping方法(另一种是Sh ...
- PL-SQL(免安装版本)报错ORA-12154
今天在帮同事安装PL/SQL时,在登陆的时候出现上述错误,从网上找了好多解决方法,但都没有解决问题.对于免安装版本的PL/SQL在登陆是应该先配置好路径:bin\instantclient_11_ ...
- jquery/js分割数组
substr(star[,length]);//star起始位置 length截取的长度 substring(star,end);//star起始位置,end结束位置 都是以0开始的索引值
- Shell基础-环境变量配置文件
Shell基础-环境变量配置文件 source 配置文件 或者 . 配置文件: 把环境变量写入配置文件后,需要用户重新登陆才能生效,而是用source命令,则能直接生效 主要的配置文件: /etc/p ...
- socket reuse
int k = 1; if( SUCCESS != m_socketServer.setSockOptSocket( SO_REUSEADDR, (char*)&k, sizeo ...