LINQ小组的结果

时间:2013-11-11 13:52:18

标签: entity-framework linq-to-sql

我花了一整天的时间试图弄清楚如何在下面加入/分组我的查询,有人可以帮助我或指导我完成所需的输出吗? -i包含一些外键值以便于参考)

Below is my Table Grade
rowID testID  studentID     Grade
1     1       1(class2011)  50
2     1       1(class2011)  90
3     2       1(class2011)  100
4     2       2(class2012)  85


--Student table
StudentID   Classyear
1           2(class2011)
2           3(class2012)
3           1(class2010)

--Classyear Table
ClassYearID    Desc
1              2010
2              2011     
3              2012

我在下面的查询(显示testID,失败(通过率= 80),通过,采取,评价)

var h = list.GroupBy(a => a.testID)
        .Select(a => {
           int _failed = a.Count(g => g.Grade < 80);
           int _passed = a.Count(g => g.Grade >= 80);
           int _rate = (int)(_passed / (double)a.Count() * 100.0);

           return new {
             testID = a.Key,
             failed = _failed,
             passed = _passed,
             taken = a.Count(),
             rate = _rate,
          };     
        }); 

The result1
testID  failed  passed  taken   Rate
1       1       1       2       50%  
2       0       2       2       100%

现在,这是我的大问题:我上表中的学生不属于     同一年级。我需要通过testID和classyear对此进行分组。     请参阅下面的所需输出:

testID  ClassyearID failed  passed  taken   Rate    
1       1(2010)     0       0       0       0
1       2(2011)     1       1       2       50%
1       3(2012)     0       0       0       0

2       1(2010)     0       0       0       0
2       2(2011)     0       1       1       100%
2       3(2012)     0       1       1       100%

您可以立即看到与结果1的不同.Test2的统计数据分为2011级和2012级。

希望我的确清楚了解我的意图。也许我会稍后发布我的糟糕代码试图获得所需的输出。感谢

1 个答案:

答案 0 :(得分:0)

你不能这样做吗?:

var h = list.GroupBy(a =>new {a.testID,a.classyear})
        .Select(a => {
           int _failed = a.Count(g => g.Grade < 80);
           int _passed = a.Count(g => g.Grade >= 80);
           int _rate = (int)(_passed / (double)a.Count() * 100.0);

           return new {
             testID = a.Key.testID,
             classyear=a.Key.classyear,
             failed = _failed,
             passed = _passed,
             taken = a.Count(),
             rate = _rate,
          };     
        });