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