[.NET]如何將同一欄位資料,分割成不同欄位(好用的Linq Group)

[.NET]如何將同一欄位資料,分割成不同欄位(好用的Linq Group)

有朋友問「如何將同一欄位資料,分割成不同欄位」,直接看示意圖比較清楚,如下,

table--A
AA---BB------CC
A----商品----鞋子
A----價格----20
A----價差----3
A----備註1---50
B----商品----衣服
B----價格----30
B----價差----0
B----備註2---10
C----商品----帽子
C----價格----10
C----價差----2
C----備註3---5

table--B
類別----A------B------C
商品----鞋子---衣服---帽子
價格----20-----30-----10
價差----3------0------2
備註1---50-----NULL---NULL
備註2---NULL---10-----NULL
備註3---NULL---NULL---5

 

如果想要在DB中處理的話,可以參考「將多筆資料中某一欄的資料轉作一列顯示」。

那如果要在程式中處理的話,要如何處理呢?

之前剛好練習過使用Linq的Group(將DataTable中各2筆資料中去除DBNull然後合併),這個也是可以透過Group來處理哦!

請參考以下的做法,


//資料準備
DataTable dtA = new DataTable("A");
dtA.Columns.Add("AA", typeof(string));
dtA.Columns.Add("BB", typeof(string));
dtA.Columns.Add("CC", typeof(string));
dtA.Rows.Add("A","商品" , "鞋子");
dtA.Rows.Add("A", "價格", "20");
dtA.Rows.Add("A", "價差", "3");
dtA.Rows.Add("A", "備註1", "50");

dtA.Rows.Add("B", "商品", "衣服");
dtA.Rows.Add("B", "價格", "30");
dtA.Rows.Add("B", "價差", "0");
dtA.Rows.Add("B", "備註2", "10");

dtA.Rows.Add("C", "商品", "帽子");
dtA.Rows.Add("C", "價格", "10");
dtA.Rows.Add("C", "價差", "2");
dtA.Rows.Add("C", "備註3", "5");


DataTable dtB = new DataTable("B");
dtB.Columns.Add("類別", typeof(string));
//依Table A 的AA欄位加入Table B的欄位
var groupColumnAA =
	from row in dtA.AsEnumerable()
	group row by row["AA"]
		into g
		select new
		{
			ID = g.Key
		};
foreach (var item in groupColumnAA)
{
	dtB.Columns.Add(item.ID.ToString(), typeof(string));
}

//開始加入資料
//取出類別資料及相關的資料
var groupColumnBB =
	from row in dtA.AsEnumerable()
	group row by row["BB"]
		into g
		select new
		{
			ID = g.Key,
			ColumnValues = g
		};

//將類別資料新增到Table B之中
foreach (var groupBB in groupColumnBB)
{
	var tableBNewRow = dtB.NewRow();
	tableBNewRow["類別"] = groupBB.ID;
	foreach (var item in groupColumnAA)
	{
		var columnValue = (from r in groupBB.ColumnValues
						  where r["AA"].ToString().Equals(item.ID.ToString()) 
						  select r).FirstOrDefault();
		if (columnValue != null)
		{
			tableBNewRow[item.ID.ToString()] = columnValue["CC"];
		}
	}
	dtB.Rows.Add(tableBNewRow);
}

 

image

不知大家是否有其他的做法呢?

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^