2016-03-15 196 views
0

我一直在努力解决这个问题一段时间,并想知道我是否可以得到一些帮助。来自Datatable for Pivot Table的动态Linq查询

我有以下项目:

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(); 
} 

我怎样才能筛选出在组合中的每个值(可变数目行列数),对我来说很难。不仅如此,我需要为每个值列选择所有值,以便我可以将其合并。

任何帮助都会很大!

感谢 乔恩

+0

因此,我创建了一组手动检查表并执行聚合递归字典函数的函数,但是我想看看是否可以将此过程进行linq化。我不知道递归函数是否有用 - 我应该添加它吗? – Jon

回答

1

不是绝对清楚如何输入数据的样子;因为你想建立的数据透视表我认为它可以作为这样的数据集(如果不是应该转换为表格视图旋转操作接受的):

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

和所需的数据透视表是类似的东西(允许使用“COL1”值枢轴表列,和“COL2”值的行,并且对于值VAL1的SUM):

为透视表
 | 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 

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

+0

是你的图书馆免费下载? – Jon

+0

@Jon NReco.PivotData nuget包(在上面的代码片段中使用了哪些类)可以在单个部署项目(SaaS除外)中免费使用。 –