动态Linq查询来自数据表的数据透视表

时间:2016-03-15 01:29:09

标签: c# linq dynamic datatable pivot

我一直在努力解决这个问题,并且想知道我是否能得到一些帮助。

我有以下项目:

Datatable inputdata = //Data from large scale SQL query
var rowvals = (from x in reportattrs.AsEnumerable()
                       where x.Field<long>("COLFORREPORT") == 0 && x.Field<long>("VALUEFIELD") == 0
                       orderby x.Field<long>("ORDERDISPLAY")
                       select new { Name = x.Field<object>("FIELDNAME") });
var colvals = (from x in reportattrs.AsEnumerable()
                       where x.Field<long>("COLFORREPORT") == 1 && x.Field<long>("VALUEFIELD") == 0
                       orderby x.Field<long>("ORDERDISPLAY")
                       select new { Name = x.Field<object>("FIELDNAME") });
var datavals = (from x in reportattrs.AsEnumerable()
                        where x.Field<long>("COLFORREPORT") == 1 && x.Field<long>("VALUEFIELD") == 1
                        orderby x.Field<long>("ORDERDISPLAY")
                        select new { Name = x.Field<object>("FIELDNAME") });

Rowvals是我们要在行中过滤的表的属性,colvals是数据透视表的列值,datavals是数据总和

我想要做的是创建我自己的自定义数据透视表例程,该例程允许我使用更复杂的方法进行过滤和分层。

我能够获得一行的特定不同值:

foreach(object val in rowvals){
var distinctValues = dsValues.AsEnumerable()
                            .Select(row => new {
                                attribute1_name = row.Field<string>(val)
                             })
                            .Distinct();
}

我如何过滤出组合中的每个值(对于可变数字的行和列)对我来说很难。不仅如此,我还需要为每个值列选择所有值,以便我可以按照我认为合适的方式对其进行汇总。

任何帮助都会很大!

由于 乔恩

1 个答案:

答案 0 :(得分:1)

输入数据的外观并不十分清楚;因为你想构建数据透视表我假设它可以像那样呈现为数据集(如果不是,它应该被转换为可接受的数据透视操作):

col1 | col2 | val1 
-------------------
 C1  |  R1  |  1 
 C1  |  R2  |  2
 C1  |  R1  |  3
 C2  |  R1  |  4

和所需的数据透视表就是这样的(让我们使用数据透视表列的col1&#39;值和行的&#39; col2&#39;值,以及val1的值为值):< / p>

     |  C1  |  C2 
-----------------
 R1  |  4   |  4
 R2  |  2   |  0 (or empty)

像这样的数据透视表的数据可以通过NReco PivotData库轻松计算,只需几行代码(免责声明:我是这个库的作者):

// group and calculate measures
var pivotData = new PivotData(
    new string[] {"col1","col2"},
    new SumAggregatorFactory("val1"),
    new DataTableReader(t) );
// get pivot table model for accessing columns/rows/values in easy way
var pivotTable = new PivotTable(
    new []{"col2"}, // row dimension(s)
    new []{"col1"}, // column dimension(s)
    pivotData );

var rowLabels = pivotTable.RowKeys;
var colLabels = pivotTable.ColumKeys;
var cellValue = pivotTable[0, 0].Value; // R1 + C1: 4
var grandTotal = pivotTable[null,null].Value; // 10

您还可以为行/列指定多个列,并可以计算多个度量。如果不清楚,请随时与我联系。