いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

ADO.NET入門記-023 (System.Data.DataTableについて(02) (DataTable内で計算) (DataTable, Compute))


過去の分は以下のリンクから見れます。


てか、2年位ほったらかしてましたww
こないだ、ふいにDataTableの処理を書いていて、あれ?この処理どうやるんだっけ??って
なったのでメモ書き再開します。


DataTableにて、ちょっとした集約処理をしたい場合(合計を求めるとか最大値を求めるとか)
以下のメソッドを利用します。

DataTable.Compute(expression, filter)


一つ目の引数には式を、2つ目の引数には計算の際に絞り込む条件を書きます。


注意点として、以下のものがあります。

  1. Computeメソッドには集約関数が必要になります。つまり(列A+列B)のような式を設定するとエラーとなります。
    1. 利用できる集約関数は、Sum, Max, Min, Avg, Count, StDev, Varです。
  2. 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