データの集計を目的に使われるクロス集計を、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()
};