2014-02-06 73 views
0

这是一个ASP.NET MVC项目。目前,我有一个表,如:将列转置为行并将日期行转换为列

Skill   Date  Offered  Answered Abandoned 
SampleSkill1 12/1/2013 53585  52549  1036 
SampleSkill2 12/1/2013 7170  6997  173 
SampleSkill1 11/1/2013 45635  45189  446 
SampleSkill2 11/1/2013 6481  6378  103 
SampleSkill1 10/1/2013 54838  54208  630 
SampleSkill2 10/1/2013 7361  7235  126 

我试图获取数据表中的一样:

SampleSkill1

Type  Oct  Nov  Dec 
Offered  53585 52549 1036 
Answered 45635 45189 446 
Abandoned 54838 54208 630 

我已经能够获得最接近的是做这样的事情这个:

var StatsList = db.Stats.Where(c => c.Skill == "SampleSkill1").ToList(); 
var OfferedStatsQuery = StatsList 
    .GroupBy(c => c.Skill) 
    .Select(g => new StatsPivot { 
     Skill = g.Key, 
     Oct = g.Where(c => c.Date.Month == 10).Sum(c => c.Offered), 
     Nov = g.Where(c => c.Date.Month == 11).Sum(c => c.Offered), 
     Dec = g.Where(c => c.Date.Month == 12).Sum(c => c.Offered) 
    }); 
var AnsweredStatsQuery = StatsList 
    .GroupBy(c => c.Skill) 
    .Select(g => new StatsPivot { 
     Skill = g.Key, 
     Oct = g.Where(c => c.Date.Month == 10).Sum(c => c.Answered), 
     Nov = g.Where(c => c.Date.Month == 11).Sum(c => c.Answered), 
     Dec = g.Where(c => c.Date.Month == 12).Sum(c => c.Answered) 
    }); 

我相信这不是做这种事情的最好/正确的方法,但我我对LINQ很陌生。有关如何有效实现预期结果的任何建议?

回答

0

那么我的建议是在数据库端(可能通过存储过程)而不是在代码中执行它。不太确定这个建议是否对您有所限制,因为那样您的工作变得非常简单,高效,并且您也可以获得很多选择。查看链接here以获得对类似问题的解答。

希望这会有所帮助。