2013-11-11 3 views
0

Я потратил весь день, пытаясь выяснить, как подключиться/сгруппировать мой запрос ниже, может ли кто-нибудь помочь мне или вести меня для завершения желаемого вывода? -i заключены некоторые из внешних ключевых значений для удобства)Результаты группы LINQ

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), пропущенный, принятый, Rate)

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

Надежда я объяснить достаточно ясно мои намерения. Возможно, я опубликую позже мой дрянной код, пытаясь получить желаемый результат. Благодаря

ответ

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, 
      };  
     }); 
Смежные вопросы