過去の分は以下のリンクから見れます。
- ADO.NET入門記-014 (System.Data.DataTableついて(01) (DataTable, DataRow, DataColumn))
てか、2年位ほったらかしてましたww
こないだ、ふいにDataTableの処理を書いていて、あれ?この処理どうやるんだっけ??って
なったのでメモ書き再開します。
DataTableにて、ちょっとした集約処理をしたい場合(合計を求めるとか最大値を求めるとか)
以下のメソッドを利用します。
DataTable.Compute(expression, filter)
一つ目の引数には式を、2つ目の引数には計算の際に絞り込む条件を書きます。
注意点として、以下のものがあります。
- Computeメソッドには集約関数が必要になります。つまり(列A+列B)のような式を設定するとエラーとなります。
- 利用できる集約関数は、Sum, Max, Min, Avg, Count, StDev, Varです。
- Computeメソッドに記述できる列は一つだけです。2つ以上の列の計算結果を元に合計を求める際などは予めDataColumnを作成しておく必要があります。
つまり、
table.Compure("Sum([Col1] + [Col2])", null);
はエラーとなります。
table.Compure("Sum([Col1])", null);
はオッケイです。
で、Sum([Col1] + [Col2])という計算を行いたい場合は、以下のように予め列を作成し
その列で、事前に計算を済ませた後Sumします。
// Col1, Col2が既にあるとする。 DataColumn col3 = table.Columns.Add("Col3", typeof(decimal)); col3.Expression = "[Col1] + [Col2]"; object result = table.Compute("Sum([Col3])", null);
2番目の引数のフィルターは以下のようにて設定します。Selectメソッドで指定するのと
同じ要領です。
table.Compute("Sum([Col3])", "[Col1] >= 1000");
以下、サンプルです。
#region DataTableSamples-01 public class DataTableSamples01 : IExecutable { public void Execute() { DataTable table = new DataTable(); table.Columns.Add("Val", typeof(decimal)); for(int i = 0; i < 10; i++) { table.LoadDataRow(new object[]{i * 0.1}, true); } object result = table.Compute("Sum([Val])", "[Val] >= 0.5"); Console.WriteLine("{0}:{1}", result, result.GetType().FullName); } } #endregion