Guest User

Untitled

a guest
Nov 13th, 2018
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.07 KB | None | 0 0
  1. DataTable vDT1 = new DataTable();
  2. vDT1.Columns.Add("Key");
  3. vDT1.Columns.Add("Key2");
  4. vDT1.Columns.Add("Data1");
  5. vDT1.Columns.Add("Data2");
  6.  
  7. vDT1.Rows.Add(new object[] { "01", "ZZ", "DATA1_AAAA", "DATA2_AAAA" });
  8. vDT1.Rows.Add(new object[] { "02", "ZZ", "DATA1_BBBB", "DATA2_BBBB" });
  9.  
  10. DataTable vDT2 = new DataTable();
  11. vDT2.Columns.Add("Key");
  12. vDT2.Columns.Add("Key2");
  13. vDT2.Columns.Add("Data3");
  14. vDT2.Columns.Add("Data4");
  15.  
  16. vDT2.Rows.Add(new object[] { "01", "ZZ", "DATA3_AAAA", "DATA4_AAAA" });
  17. vDT2.Rows.Add(new object[] { "01", "ZZ", "DATA3_BBBB", "DATA4_BBBB" });
  18. vDT2.Rows.Add(new object[] { "01", "ZZ", "DATA3_CCCC", "DATA4_CCCC" });
  19. vDT2.Rows.Add(new object[] { "01", "ZZ", "DATA3_DDDD", "DATA4_DDDD" });
  20.  
  21. DataTable vDT3 = new DataTable();
  22. vDT3.Columns.Add("Key");
  23. vDT3.Columns.Add("Key2");
  24. vDT3.Columns.Add("Data1");
  25. vDT3.Columns.Add("Data2");
  26. vDT3.Columns.Add("KeyTemp1");
  27. vDT3.Columns.Add("KeyTemp2");
  28. vDT3.Columns.Add("Data3");
  29. vDT3.Columns.Add("Data4");
  30.  
  31. DataRow vDRnull = vDT2.Rows.Add();
  32.  
  33. var vLINQ = vDT1.AsEnumerable()
  34. .GroupJoin(vDT2.AsEnumerable(),
  35. dr1 => new { key1 = dr1["Key"], key2 = dr1["Key2"] },
  36. dr2 => new { key1 = dr2["Key"], key2 = dr2["Key2"] },
  37. (dr1, result) => dr1.ItemArray.Koncat(
  38. ((result.FirstOrDefault<DataRow>() == null)
  39. ? vDRnull
  40. : result.FirstOrDefault<DataRow>()).ItemArray));
  41.  
  42. foreach (var aw in vLINQ)
  43. {
  44. vDT3.Rows.Add(aw);
  45. }
  46.  
  47. public static T[] Koncat<T>(this T[] x, T[] y)
  48. {
  49. if (x == null) throw new ArgumentNullException("x");
  50. if (y == null) throw new ArgumentNullException("y");
  51. int oldLen = x.Length;
  52. Array.Resize<T>(ref x, x.Length + y.Length);
  53. Array.Copy(y, 0, x, oldLen, y.Length);
  54. return x;
  55. }
  56.  
  57. DataSet ds = new DataSet();
  58.  
  59. DataTable dt1 = new DataTable();
  60. dt1.Columns.Add("Key");
  61. dt1.Columns.Add("Key2");
  62. dt1.Columns.Add("Data1");
  63. dt1.Columns.Add("Data2");
  64.  
  65. dt1.Rows.Add(new object[] { "01", "ZZ", "DATA1_AAAA", "DATA2_AAAA" });
  66. dt1.Rows.Add(new object[] { "02", "ZZ", "DATA1_BBBB", "DATA2_BBBB" });
  67.  
  68. DataTable dt2 = new DataTable();
  69. dt2.Columns.Add("Key");
  70. dt2.Columns.Add("Key2");
  71. dt2.Columns.Add("Data3");
  72. dt2.Columns.Add("Data4");
  73.  
  74. dt2.Rows.Add(new object[] { "01", "ZZ", "DATA3_AAAA", "DATA4_AAAA" });
  75. dt2.Rows.Add(new object[] { "01", "ZZ", "DATA3_BBBB", "DATA4_BBBB" });
  76. dt2.Rows.Add(new object[] { "01", "ZZ", "DATA3_CCCC", "DATA4_CCCC" });
  77. dt2.Rows.Add(new object[] { "01", "ZZ", "DATA3_DDDD", "DATA4_DDDD" });
  78. //dt2.Rows.Add(new object[] { "02", "ZZ", "DATA5_DDDD", "DATA4_DDDD" });
  79.  
  80. ds.Tables.Add(dt1);
  81. ds.Tables.Add(dt2);
  82.  
  83. // specify the relations between the data tables
  84. DataRelation drel = new DataRelation(
  85. "MyJoin",
  86. new DataColumn[] { dt1.Columns["Key"], dt1.Columns["Key2"] },
  87. new DataColumn[] { dt2.Columns["Key"], dt2.Columns["Key2"]});
  88.  
  89. ds.Relations.Add(drel);
  90.  
  91. DataTable jt = new DataTable("JoinedTable");
  92. jt.Columns.Add("Key");
  93. jt.Columns.Add("Key2");
  94. jt.Columns.Add("Data1");
  95. jt.Columns.Add("Data2");
  96. jt.Columns.Add("Data3");
  97. jt.Columns.Add("Data4");
  98. ds.Tables.Add(jt);
  99.  
  100. // create the result table
  101. foreach (DataRow row in dt1.Rows)
  102. {
  103. var childRows = row.GetChildRows("MyJoin");
  104. // mimics left join
  105. var hasChildRows = childRows.Length > 0;
  106. if (!hasChildRows)
  107. {
  108. jt.Rows.Add(row["Key"], row["Key2"], row["Data1"], row["Data2"], null, null);
  109. continue;
  110. }
  111.  
  112. foreach (var child in childRows)
  113. {
  114. jt.Rows.Add(row["Key"], row["Key2"], row["Data1"], row["Data2"], child["Data3"], child["Data4"]);
  115. }
  116. }
  117.  
  118. jt.Rows.Dump(); // LINQPad dump
  119.  
  120. dr1.ItemArray
  121. .Concat(result.Any() ? result.First().ItemArray: Enumerable.Empty<object>())
  122. .ToArray());
  123.  
  124. var vLINQ = vDT1.AsEnumerable()
  125. .GroupJoin(
  126. vDT2.AsEnumerable(),
  127. dr1 => new { key1 = dr1["Key"], key2 = dr1["Key2"] },
  128. dr2 => new { key1 = dr2["Key"], key2 = dr2["Key2"] },
  129. (dr1, result) =>
  130. dr1.ItemArray
  131. .Concat(result.Any() ? result.First().ItemArray: Enumerable.Empty<object>())
  132. .ToArray());
  133.  
  134. dr1.ItemArray
  135. .Concat(result.FirstOrDefault()?.ItemArray ?? Enumerable.Empty<object>())
  136. .ToArray());
Add Comment
Please, Sign In to add comment