2015-02-24 117 views
1

我在使用LINQ完成這個任務時遇到了一些麻煩。沒有太多的經驗。
我有以下信息: 學校,考試,教師,學生Linq group by sub grouping

我需要的學校數量和教師對每個測試的次數的計數,但我只需要計算實例,其中老師,測試,有超過10名學生。

這裏是SQL:

select 
    test, 
    count(distinct school) school_count, 
    count(distinct teacher) teacher_count 
from 
    (select 
    test, 
    teacher, 
    school 
    from list 
    group by 
    test, 
    school, 
    teacher 
    having 
    count(teacher) > 10) a 
group by a.test 

我的結構非常簡單。一個類(不是實際的代碼)

class tests 
{ 
public string teacher; 
public string test; 
public string school; 
public string studentid; 
} 

然後我有一個測試列表,我正在做查詢。
}

+0

這裏是一個教程,可能有助於解釋如何使用「分組依據」子句 [SQL Tutorial Group By](http://beginner-sql-tutorial.com/sql-group-by-clause.htm) – MethodMan 2015-02-24 16:32:50

回答

0

Linq中的wherehaving之間沒有區別。你可以做到以下幾點:

void Tests(IEnumerable<tests> tests) 
{ 
    var result = 
     from t in tests.Select(t => new {Teacher = t.teacher, Test = t.test, School = t.school}).Distinct() 
     group t by t.Test 
     into g 
     where g.Select(t => t.Teacher).Distinct().Count() > 10 
     select new 
     { 
      Test = g.Key, 
      TeacherCount = g.Select(t => t.Teacher).Distinct().Count(), 
      SchoolCount = g.Select(t => t.School).Distinct().Count() 
     }; 

} 

旁註:你的數據庫結構可能需要normalization,你的命名約定不recommended

+0

對不起,我沒有添加我正在使用的結構。我已經在上面添加了它。與你的假設不太一樣。 – user568551 2015-02-24 16:51:58

+0

@ user568551答案已更新 – Bas 2015-02-24 17:07:38

+0

我試過了,但沒有奏效。是的,結構應該更加標準化,但它實際上是我讀的一個csv文件,而不是數據庫。我在下面寫了一篇文章,講述了一些正在工作但不太優雅的東西 – user568551 2015-02-24 19:27:49

0
var initial_group = from st in this       group st by new { st.TestName, st.School, st.Teacher } 
          into testGroups 
          where testGroups.Count() > 10 
          select new 
          { 
           Test = testGroups.Key.TestName, 
           School = testGroups.Key.School, 
           Teacher = testGroups.Key.Teacher, 
           Items = testGroups 
          }; 

    var results = from grp in initial_group 
        group grp by grp.Test 
         into testGroups 

         select new 
          { 
           Test = testGroups.Key, 
           NumSchools = testGroups.Select(a => a.School).Distinct().Count(), 
           NumTeachers = testGroups.Select(a => a.Teacher).Distinct().Count() 
          }; 

這是有效的,但它看起來不太優雅。能很好地結合這兩個查詢。