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

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

void Main()
{
	DataTable dt1 = new DataTable();
	dt1.Columns.Add("A", typeof(string));
	dt1.Columns.Add("B", typeof(string));
	dt1.Columns.Add("C", typeof(string));
	dt1.Columns.Add("D", typeof(int));

	// 資料填充
	DataRow dr1 = dt1.NewRow();
	dr1["A"] = "A1";
	dr1["B"] = "B1";
	dr1["C"] = "C1";
	dr1["D"] = "1";
	dt1.Rows.Add(dr1);

	dr1 = dt1.NewRow();
	dr1["A"] = "A2";
	dr1["B"] = "B2";
	dr1["C"] = "C2";
	dr1["D"] = "2";
	dt1.Rows.Add(dr1);

	DataTable dt2 = new DataTable();
	dt2.Columns.Add("E", typeof(string));
	dt2.Columns.Add("F", typeof(string));
	dt2.Columns.Add("G", typeof(int));

	// 資料填充
	DataRow dr2 = dt2.NewRow();
	dr2["E"] = "A1";
	dr2["F"] = "B1";
	dr2["G"] = "10";
	dt2.Rows.Add(dr2);

	dr2 = dt2.NewRow();
	dr2["E"] = "A2";
	dr2["F"] = "B2";
	dr2["G"] = "20";
	dt2.Rows.Add(dr2);


	// 使用 LINQ 合併 dt1 和 dt2
	var query = from row1 in dt1.AsEnumerable()
				select dt1.Clone().LoadDataRow(new object[]
				{
				row1["A"],
				row1["B"],
				row1["C"],
				
				//D (子查詢, 由dt2取得資料)
                    //->因為dt1["D"]是int, 若使用select得到的型態為System.Int32, 不匹配, 改用sum取得資料型態為int (需視資料結構是否符合)
				(dt2.AsEnumerable().Where(r => r.Field<string>("E") == row1.Field<string>("A") &&
				                               r.Field<string>("F") == row1.Field<string>("B"))
								   //.Select(s => s.Field<int>("G"))),  //==> 無法將類型 'System.Data.EnumerableRowCollection`1[System.Int32]' 的物件轉換為類型 'System.IConvertible' 
								   .Sum(s => s.Field<int>("G"))),
				}, false);

	DataTable dt3 = dt1.Clone();
	if (query.Count() > 0)
	{
		dt3 = query.CopyToDataTable();
	}
	
	dt3.Dump();
}

 

留言

這個網誌中的熱門文章

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

Oracle 例外控制(Exception Control)

Oracle 工作排程 DBMS_JOB 筆記