LINQでクロス集計表の作成


データの集計を目的に使われるクロス集計を、DataTableに対するLINQで書いてみます。
EXCELでも簡単にできると思いますが、私はやりたくないです。

やってみよう

DataTableに入っているデータをcolumn1, column2という2軸でクロス集計しています。

var query = from table 
            in dataTable.AsEnumerable()
            group table by new { column1 = table[column1], column2 = table[column2] }
            into groupby
          //orderby hogepiyo
            select new
                {
                     groupby.Key.column1
                    ,groupby.Key.column2
                    ,frequency = groupby.Count()
                };

並び替え

orderby句をLINQの中に入れるとなぜかうまくいかなかったので、
集計結果にメソッド記法でソートを実施

query.OrderBy(x => x.column1).ThenBy(x => x.column2);

//orderby hogepiyoの部分に

orderby groupby.Key.column1.ToString(),groupby.Key.column2.ToString()

と書くと動きそうですがなぜかダメでした。
正しい書き方わかる人いたら教えてください。

追記1

このクエリではgroupby句に引っかかる箇所しかとれないので、厳密にクロス集計表を作るなら引っかからなかった箇所は0で埋める必要があります。

追記2

chocolamintさんにコメントで指摘いただいたのですが、
上記のクエリだと辞書順ソートになってしまいます。
(OrderByメソッドも同様です。ごめんなさい;;)

正しくは、tableへのアクセスで

table.Field<int>(column1)

として数値として取得する必要があります。

var query = from table 
            in dataTable.AsEnumerable()
            group table by new { column1 = table.Field<int>(column1), column2 = table.Field<int>(column2) }
            into groupby
            orderby groupby.Key.column1, groupby.Key.column2
            select new
                {
                     groupby.Key.column1
                    ,groupby.Key.column2
                    ,frequency = groupby.Count()
                };