3

不確定な列数で C# と Linq を使用してピボットまたはクロス集計を実行する方法が必要だと思います。ただし、最初の詳細を追加して、どこに行くかを確認します。

< はじめの詳細 >

次の 2 つのフィールドを持つテーブルを想像してください。

string EventName;
Datetime WhenItHappend;

以下の例のようなレポートを生成します。ここでは、EventName でグループ化し、日付と時間枠の数を計算する一連の列を作成します。難しさは明らかに可変数の列です。

  Sport   Jan 2010Jan 2009Feb 2010Feb 2009
Basketball    26      18      23      16  
Hockey        28      19      25      18  
Swimming      52      45      48      43  

顧客は、レポート用に任意の数の名前付きイベント カウンターを作成できます。関数は常に同じです: 「名前」、「開始」、「終了」。

これをC#で単一のlinq IQueryable結果として組み立てる方法はありますか?

< 終了 開始詳細 >

SQL に関する限り、日付範囲テーブル {TimeFrameName, begin, end} を作成して、それを上記のテーブルに結合しました。begin <= whenItHappened および whenItHappened <= end で、{EventName, TimeFrameName} の適切なセットが生成されました。 count(*) を実行しましたが、行を列に変換してデータを変換する方法がまだ残っていました。

4

1 に答える 1

2

クラス/SQL行があります

class Thing
{
    public string EventName;
    public DateTime WhenItHappend;
}

EventName と WhenItHappened.Month でグループ化したい

// make a collection and add some Things to it
var list = new List<Thing>();
list.Add(new Thing(){ .... });
// etc

var groups = list.GroupBy(t => new { t.WhenItHappend.Month, t.EventName } );

これで、基本的にコレクションの 2 次元配列ができました。これらを Month / EventName で繰り返し処理して、テーブルに表示したい各コレクションのアイテム数を取得できます。

foreach (var row in groups.GroupBy(g => g.Key.EventName))
{
    foreach (var month in row.GroupBy(g => g.Key.Month))
    {
        var value = month.Count();
    }
}

GroupBy 演算子はグループのコレクションを返します。各グループには、キーと、指定されたキーに一致する元のリストのサブセットが含まれています。2 次元の Key を指定すると、結果をコレクションの 2 次元配列として扱うことができます。

GroupBy は非常に強力な演算子です。

于 2010-03-08T23:00:07.263 に答える