2010年4月27日 星期二

在 DataTable 進行 Group by 並且取 Sum 的運算 (後續)

在前一篇 在 DataTable 進行 Group by 並且取 Sum 的運算 中,原以為已經提供可用的 solution 了,結果沒那麼順利

儲存數字的 DataColumn 型態居然是 String (在資料庫中是 NVARCHAR),我無言了...

維持著手上只有 DataTable 的條件,必須作一下轉型處理才能進行運算

模擬資料來源的部分改為
DataSet ds = new DataSet();
  DataTable dt = new DataTable();
  dt.Columns.Add("GroupKey", typeof(string));
  dt.Columns.Add("Value", typeof(string));
  ds.Tables.Add(dt);

  dt.Rows.Add(new object[] { "P1", "10" });
  dt.Rows.Add(new object[] { "P2", "40" });
  dt.Rows.Add(new object[] { "P3", "50" });
  dt.Rows.Add(new object[] { "P1", "20" });
  dt.Rows.Add(new object[] { "P2", "5" });

純 ADO.NET
// 提供轉型完成的欄位
  dt.Columns.Add("Value1", typeof(int), "Convert(Value, 'System.Int32')");

  // 分組並計算 
  DataTable grouped = dt.DefaultView.ToTable("DistinctTable", 
                                             true, 
                                             new[] { "GroupKey" });
  ds.Tables.Add(grouped);
  ds.Relations.Add("Relation1", 
                   grouped.Columns["GroupKey"], 
                   dt.Columns["GroupKey"]);
  grouped.Columns.Add("SumValue", typeof(int), "Sum(Child.Value1)");
注意:試圖直接以 "Sum(Convert(Child.Value), 'System.Int32'))" 進行運算會於 runtime 時期出現 Syntax error in aggregate argument: Expecting a single column argument with possible 'Child' qualifier. 錯誤

LINQ 的版本(相形之下又更簡單了)
// 分組並計算 
  var grouped = from row in dt.AsEnumerable()
                group row by row["GroupKey"] into g
                select new 
                { 
                  GroupKey = g.Key, 
                  SumValue = g.Sum(p => int.Parse((string)p["Value"])) 
                };

沒有留言: