C#, Datatable, Join, LINQ, 子查詢

C#, Datatable, Join, LINQ, 子查詢

  1. void Main()
  2. {
  3. DataTable dt1 = new DataTable();
  4. dt1.Columns.Add("A", typeof(string));
  5. dt1.Columns.Add("B", typeof(string));
  6. dt1.Columns.Add("C", typeof(string));
  7. dt1.Columns.Add("D", typeof(int));
  8. // 資料填充
  9. DataRow dr1 = dt1.NewRow();
  10. dr1["A"] = "A1";
  11. dr1["B"] = "B1";
  12. dr1["C"] = "C1";
  13. dr1["D"] = "1";
  14. dt1.Rows.Add(dr1);
  15. dr1 = dt1.NewRow();
  16. dr1["A"] = "A2";
  17. dr1["B"] = "B2";
  18. dr1["C"] = "C2";
  19. dr1["D"] = "2";
  20. dt1.Rows.Add(dr1);
  21. DataTable dt2 = new DataTable();
  22. dt2.Columns.Add("E", typeof(string));
  23. dt2.Columns.Add("F", typeof(string));
  24. dt2.Columns.Add("G", typeof(int));
  25. // 資料填充
  26. DataRow dr2 = dt2.NewRow();
  27. dr2["E"] = "A1";
  28. dr2["F"] = "B1";
  29. dr2["G"] = "10";
  30. dt2.Rows.Add(dr2);
  31. dr2 = dt2.NewRow();
  32. dr2["E"] = "A2";
  33. dr2["F"] = "B2";
  34. dr2["G"] = "20";
  35. dt2.Rows.Add(dr2);
  36. // 使用 LINQ 合併 dt1 和 dt2
  37. var query = from row1 in dt1.AsEnumerable()
  38. select dt1.Clone().LoadDataRow(new object[]
  39. {
  40. row1["A"],
  41. row1["B"],
  42. row1["C"],
  43. //D (子查詢, 由dt2取得資料)
  44. //->因為dt1["D"]是int, 若使用select得到的型態為System.Int32, 不匹配, 改用sum取得資料型態為int (需視資料結構是否符合)
  45. (dt2.AsEnumerable().Where(r => r.Field<string>("E") == row1.Field<string>("A") &&
  46. r.Field<string>("F") == row1.Field<string>("B"))
  47. //.Select(s => s.Field<int>("G"))), //==> 無法將類型 'System.Data.EnumerableRowCollection`1[System.Int32]' 的物件轉換為類型 'System.IConvertible'
  48. .Sum(s => s.Field<int>("G"))),
  49. }, false);
  50. DataTable dt3 = dt1.Clone();
  51. if (query.Count() > 0)
  52. {
  53. dt3 = query.CopyToDataTable();
  54. }
  55. dt3.Dump();
  56. }

 

留言

這個網誌中的熱門文章

ORA-12514: TNS: 監聽器目前不知道連線描述區中要求的服務

Oracle 工作排程 DBMS_JOB 筆記

Oracle 例外控制(Exception Control)