1. var query = (from x in a.AsEnumerable()
  2. join y in b.AsEnumerable() on x.Field<int>("col1") equals y.Field<int>("col1")
  3. select new { col1= y.Field<int>("col1"), col2=x.Field<int>("col2") }).ToList();

  1. DataTableHelper
  1. public static class DataTableHelper
  2. {
  3. public enum JoinType
  4. {
  5. /// <summary>
  6. /// Same as regular join. Inner join produces only the set of records that match in both Table A and Table B.
  7. /// </summary>
  8. Inner = ,
  9. /// <summary>
  10. /// 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.
  11. /// </summary>
  12. Left =
  13. }
  14.  
  15. /// <summary>
  16. /// Joins the passed in DataTables on the colToJoinOn.
  17. /// <para>Returns an appropriate DataTable with zero rows if the colToJoinOn does not exist in both tables.</para>
  18. /// </summary>
  19. /// <param name="dtblLeft"></param>
  20. /// <param name="dtblRight"></param>
  21. /// <param name="colToJoinOn"></param>
  22. /// <param name="joinType"></param>
  23. /// <returns></returns>
  24. /// <remarks>
  25. /// <para>http://stackoverflow.com/questions/2379747/create-combined-datatable-from-two-datatables-joined-with-linq-c-sharp?rq=1</para>
  26. /// <para>http://msdn.microsoft.com/en-us/library/vstudio/bb397895.aspx</para>
  27. /// <para>http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html</para>
  28. /// <para>http://stackoverflow.com/questions/406294/left-join-and-left-outer-join-in-sql-server</para>
  29. /// </remarks>
  30. public static DataTable JoinTwoDataTablesOnOneColumn(DataTable dtblLeft, DataTable dtblRight, string colToJoinOn, JoinType joinType)
  31. {
  32. //Change column name to a temp name so the LINQ for getting row data will work properly.
  33. string strTempColName = colToJoinOn + "_2";
  34. if (dtblRight.Columns.Contains(colToJoinOn))
  35. dtblRight.Columns[colToJoinOn].ColumnName = strTempColName;
  36.  
  37. //Get columns from dtblLeft
  38. DataTable dtblResult = dtblLeft.Clone();
  39.  
  40. //Get columns from dtblRight
  41. var dt2Columns = dtblRight.Columns.OfType<DataColumn>().Select(dc => new DataColumn(dc.ColumnName, dc.DataType, dc.Expression, dc.ColumnMapping));
  42. //Get columns from dtblRight that are not in dtblLeft
  43. var dt2FinalColumns = from dc in dt2Columns.AsEnumerable()
  44. where !dtblResult.Columns.Contains(dc.ColumnName)
  45. select dc;
  46.  
  47. //Add the rest of the columns to dtblResult
  48. dtblResult.Columns.AddRange(dt2FinalColumns.ToArray());
  49.  
  50. //No reason to continue if the colToJoinOn does not exist in both DataTables.
  51. if (!dtblLeft.Columns.Contains(colToJoinOn) || (!dtblRight.Columns.Contains(colToJoinOn) && !dtblRight.Columns.Contains(strTempColName)))
  52. {
  53. if (!dtblResult.Columns.Contains(colToJoinOn))
  54. dtblResult.Columns.Add(colToJoinOn);
  55. return dtblResult;
  56. }
  57.  
  58. switch (joinType)
  59. {
  60.  
  61. default:
  62. case JoinType.Inner:
  63. #region Inner
  64. //get row data
  65. //To use the DataTable.AsEnumerable() extension method you need to add a reference to the System.Data.DataSetExtension assembly in your project.
  66. var rowDataLeftInner = from rowLeft in dtblLeft.AsEnumerable()
  67. join rowRight in dtblRight.AsEnumerable() on rowLeft[colToJoinOn] equals rowRight[strTempColName]
  68. select rowLeft.ItemArray.Concat(rowRight.ItemArray).ToArray();
  69.  
  70. //Add row data to dtblResult
  71. foreach (object[] values in rowDataLeftInner)
  72. dtblResult.Rows.Add(values);
  73. #endregion
  74. break;
  75. case JoinType.Left:
  76. #region Left
  77. var rowDataLeftOuter = from rowLeft in dtblLeft.AsEnumerable()
  78. join rowRight in dtblRight.AsEnumerable() on rowLeft[colToJoinOn] equals rowRight[strTempColName] into gj
  79. from subRight in gj.DefaultIfEmpty()
  80. select rowLeft.ItemArray.Concat((subRight== null) ? (dtblRight.NewRow().ItemArray) :subRight.ItemArray).ToArray();
  81. //Add row data to dtblResult
  82. foreach (object[] values in rowDataLeftOuter)
  83. dtblResult.Rows.Add(values);
  84. #endregion
  85. break;
  86. }
  87. //Change column name back to original
  88. dtblRight.Columns[strTempColName].ColumnName = colToJoinOn;
  89. //Remove extra column from result
  90. dtblResult.Columns.Remove(strTempColName);
  91. return dtblResult;
  92. }
  93. }

Join two DataTables in C#的更多相关文章

  1. datatables增删改查的实现

    学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/20069 ...

  2. JQuery Datatables服务器端处理示例

    HTML <table class="table table-striped table-bordered table-hover" id="table_repor ...

  3. jquery dataTables.min.js API

    demo: http://datatables.net/release-datatables/examples/api/select_single_row.html 选择一行http://datata ...

  4. Jquery Datatables 请求参数及接收参数处理

    Jquery Datatables 请求参数及接收参数处理 /** * Created by wb-wuyifu on 2016/8/9. */ /** * Created by wb-wuyifu ...

  5. JQuery插件datatables相关api

    学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/20069 ...

  6. jquery datatables api (转)

    学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/20069 ...

  7. 最全的jquery datatables api 使用详解

    学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/20069 ...

  8. jquery datatables api

    原文地址 学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/ ...

  9. SQL Server-聚焦IN VS EXISTS VS JOIN性能分析(十九)

    前言 本节我们开始讲讲这一系列性能比较的终极篇IN VS EXISTS VS JOIN的性能分析,前面系列有人一直在说场景不够,这里我们结合查询索引列.非索引列.查询小表.查询大表来综合分析,简短的内 ...

随机推荐

  1. 项目中 poi 导出 出现html特殊符号的实体 (已解决)

    导出excel 时出现 类似这样的>  符号 , 大概是存到数据库也是这样,然后jsp解析可以解析出来,但是java不认得,需要个人写出解析方法. 废话不说,贴码: /** *转换html特殊符 ...

  2. Eclipse利用Axis2插件构建Web Service并测试

    在学习Web Service的时候,从网上找到前辈的博客http://www.cnblogs.com/hexinlin/p/3358558.html,并依此文的方法按部就班:编写欲发布的java类He ...

  3. Chapter 3.GDI/DirectDraw Internal Data Structures

    说明,在这里决定跳过第二章,实在是因为里面涉及的内容太理论,对我而言又太艰深 3.1 HANDLES AND OBJECT-ORIRNTED PROGRAMMING In normal object- ...

  4. SDK截图程序(一)

    程序将系统窗口左上角100*100的图像复制到粘贴板上.程序的关键位置上加上了注释,相关知识<windows程序设计>第14章内容 #include <windows.h> # ...

  5. Cocos2d-x win7 + vs2010 配置图文详解

    Cocos2d-x win7 + vs2010 配置图文详解 下载最新版的cocos2d-x.打开浏览器,输入cocos2d-x.org,然后选择Download,本教程写作时最新版本为cocos2d ...

  6. OpenGL阴影,Shadow Mapping(附源程序)

    实验平台:Win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): 本文描述图形学的两个最常用的阴影技术之一,Shadow Mapping方法(另一种是Sh ...

  7. PL-SQL(免安装版本)报错ORA-12154

      今天在帮同事安装PL/SQL时,在登陆的时候出现上述错误,从网上找了好多解决方法,但都没有解决问题.对于免安装版本的PL/SQL在登陆是应该先配置好路径:bin\instantclient_11_ ...

  8. jquery/js分割数组

    substr(star[,length]);//star起始位置 length截取的长度 substring(star,end);//star起始位置,end结束位置 都是以0开始的索引值

  9. Shell基础-环境变量配置文件

    Shell基础-环境变量配置文件 source 配置文件 或者 . 配置文件: 把环境变量写入配置文件后,需要用户重新登陆才能生效,而是用source命令,则能直接生效 主要的配置文件: /etc/p ...

  10. socket reuse

    int k   =   1;    if( SUCCESS != m_socketServer.setSockOptSocket( SO_REUSEADDR, (char*)&k, sizeo ...