2015-06-05 94 views
0

我希望你能帮上忙。转换Linq数据结构

我现在有一个数据结构是怎样的,所以我组后,得到了由(上名一年状态)LINQ聚集查询(此无法更改)

Name Year State Total 

Bobby 2015 East 5 

Bobby 2015 West 5 

Bobby 2015 North 10 

Paul 2015 East 15 

如何使用LINQ to我变换上述结构下面的结构。

Name Year East West North Total 

Bobby 2015 5  5  10  20 

Paul 2015 15  0  0  15 

记住我试图避免使用LINQ我GROUPBY If之类的语句state=East ? Add east value : 0,从而获得所需的结构。

感谢您的帮助。

+0

您是否需要完全基于LINQ的解决方案?如果没有,你可能会寻找专门的C#数据聚合库,可以通过你的输入数据计算数据透视表结果。 –

回答

1

这里做一个支点Linq中的一种方式:

var pivot = data 
    .GroupBy(d => new {d.Name, d.Year}) 
    .Select(g => new { 
     Name = g.Key.Name, 
     Year = g.Key.Year, 
     East = g.Where(c => c.State == "East").Sum(c => c.Total), 
     West = g.Where(c => c.State == "West").Sum(c => c.Total), 
     North = g.Where(c => c.State == "North").Sum(c => c.Total), 
     South = g.Where(c => c.State == "South").Sum(c => c.Total), 
     Total = g.Sum(c => c.Total), 
    }); 

可以使用DataTable小号做多动力枢轴(这样你就可以动态地添加列),但如果你列在设计时已知这种方法更清洁恕我直言。

+0

谢谢@D斯坦利会放弃这一切并回复你。 – Bobby

+1

如果您尝试在RavenDB索引内执行此操作,则需要使用map/reduce索引并将其分开。 Map/reduce是分布式的,所以你不可能期望随时获得全部结果。所以确保你的操作是可交换的 –