儲存數字的 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"])) };
沒有留言:
張貼留言