2017-07-14 22 views
1

NRecoライブラリを使用してピボットテーブルを構築しています。私は例を守り、DataSetから簡単なPvTを構築することができました。今私は、実行時に選択されるいくつかの尺度を受け取るPvTを構築したいと思いますが、それぞれの独自の集計式で尺度リストを使用するプロセスの動的な性質に問題があります。この式は実行時に分かります。これは合計または平均以上のものではありませんが、メジャー固有のものです。私は、次のコードを持っている:NReco実行時に複数の数値が返される

private string CreatePivotTable(DataTable dt, string[] lines, string[] columns, string[] dimensions, string measure) 
    { 

     var pivotData = new PivotData(dimensions, new SumAggregatorFactory(measure), new DataTableReader(dt)); 

     var pivotTable = new PivotTable(lines, columns, pivotData); 
     var htmlResult = new StringWriter(); 
     var pvtHtmlWr = new PivotTableHtmlWriter(htmlResult); 
     pvtHtmlWr.Write(pivotTable); 

     return htmlResult.ToString(); 
    } 

私は、実行時に対策や動的アグリゲータを追加するには、次のコードのようなものをやってみたかった:

private string CreatePivotTable(DataTable dt, string[] lines, string[] columns, string[] dimensions, Measure[] measures) 
    { 


     var pivotData = new PivotData(dimensions, null, new DataTableReader(dt)); 

     foreach(var m in measures) 
     { 
      if (m.Formula.equals("sum")) 
       pivotData.AggregatorFactory.Create(new SumAggregator(m.ColName)); 
      else if(m.Formula.equals("avg")){ 
      pivotData.AggregatorFactory.Create(new AvgAggregator(m.ColName)); 
      } 
     } 
    } 

どのように私はこのような何かを達成することができますか?それを行う方法はありますか?

あなたは次のようにいくつかの措置を収集するために PivotDataクラスを設定することができます

答えて

0

:あなたは PivotDataFactoryコンポーネント(NReco.PivotData.Extensionsアセンブリ) PivotDataConfigurationモデルによって PivotDataインスタンスを作成することができます使用することができます別の方法として

private string CreatePivotTable(
    DataTable dt, string[] lines, string[] columns, string[] dimensions, Measure[] measures) 
{ 
    var aggrFactories = new List<IAggregatorFactory>(); 
    foreach(var m in measures) { 
     if (m.Formula.equals("sum")) 
      aggrFactories.Add(new SumAggregatorFactory(m.ColName)); 
     else if(m.Formula.equals("avg")){ 
      aggrFactories.Add(new AverageAggregatorFactory(m.ColName)); 
     } 
    } 
    if (aggrFactories.Length==0) { 
     // no measures provided. 
     // Throw an exception or configure "default" measure (say, CountAggregatorFactory) 
     aggrFactories.Add(new CountAggregatorFactory()); 
    } 
    var pivotData = new PivotData(dimensions, 
     aggrFactories.Length==1 ? aggrFactories[0] : new CompositeAggregatorFactory(aggrFactories.ToArray()), 
     new DataTableReader(dt)); 
    // you code that renders HTML pivot table with PivotTableHtmlWriter 
} 

private string CreatePivotTable(DataTable dt, string[] lines, string[] columns, string[] dimensions, Measure[] measures) 
{ 
    var pvtDataFactory = new PivotDataFactory(); 
    var pivotData = pvtDataFactory.Create(new PivotDataConfiguration() { 
     Dimensions = dimensions, 
     Aggregators = measures 
      .Select(m => new AggregatorFactoryConfiguration(m.Formula, new[] {m.ColName})) 
      .ToArray() 
    }); 
    // you code that renders HTML pivot table with PivotTableHtmlWriter 
} 

PivotDataFactoryカスタムimplemeを使用する場合の標準的なアグリゲータの種類(「カウント」、「合計」、「普通」、「分」、「最大」)を知っていて、あなたはPivotDataFactory.RegisterAggregatorメソッドで登録することができます(詳細はImplement custom aggregatorを参照してください)。

実際のユーザ定義の数式(アグリゲータ値を引数として使用できる)も可能です:PivotData SDKサンプルパッケージの「DynamicFormulaMeasure」の例を参照してください。

+0

詳細な回答ありがとうございます。私は、NRecoのドキュメントを使って作品を一緒に結びつけるのに苦労していましたが、何とか可能でした。良い仕事を続けてくださいVitaliy、NRecoは素晴らしいですし、私に多くの時間を節約しています! – zriv

関連する問題