运行 时间的 NReco 多项措施

NReco multiple measures at run time

我正在使用 NReco 库构建数据透视表。我按照这些示例进行操作,并且能够从 DataSet 构建一个简单的 PvT。现在我想构建一个 PvT,它接收在 运行 时间选择的许多度量,但是我在使用每个度量列表都有自己的公式的过程的动态特性方面遇到了麻烦聚合。该公式在 运行 时间是已知的,它只不过是一个总和或一个平均值,但特定于度量。我有以下代码:

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 class 以通过以下方式收集多项措施:

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
}

作为替代方案,您可以使用 PivotDataFactory 组件(NReco.PivotData.Extensions 组件),它可以通过 PivotDataConfiguration 模型创建 PivotData 实例:

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 了解标准聚合器类型("Count"、"Sum"、"Average"、"Min"、"Max")并且如果您使用自定义实现,您可以使用 PivotDataFactory.RegisterAggregator 方法注册它们(有关详细信息,请参阅 Implement custom aggregator)。

顺便说一句,真正的用户定义公式(可以使用聚合器值作为参数)也是可能的:请参阅 PivotData SDK 示例包中的 "DynamicFormulaMeasure" 示例。