【问题标题】:Dynamic Linq Query from Datatable for Pivot Table数据表中用于数据透视表的动态 Linq 查询
【发布时间】:2016-06-30 07:01:29
【问题描述】:

我一直在为这个问题苦苦挣扎,想知道是否可以得到一些帮助。

我有以下物品:

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

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

任何帮助都会很大!

谢谢 乔恩

【问题讨论】:

  • 所以我创建了一组手动检查表并执行聚合、递归字典功能的函数,但我想看看我是否可以 linqify 这个过程。我不知道递归函数是否有帮助 - 我应该添加它吗?

标签: c# linq dynamic datatable pivot


【解决方案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

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

【讨论】:

  • 你的库可以免费下载吗?
  • @Jon NReco.PivotData nuget 包(上面的代码 sn-p 中使用了哪些类)可以在单一部署项目中免费使用(SaaS 除外)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
相关资源
最近更新 更多