4

私のプロジェクトには、次のような2つのクラスがあります。

public class Teacher
{
    public virtual long Id {get;set;}
    public virtual IList<Student> Students {get;set;}
}


public class Student
{
    public virtual long Id {get;set;}
    public virtual string Name {get;set;}
}

各教師とグループの生徒のカウントをカウント結果で取得するクエリが必要です。また、各カウントの頻度(ええと...カウント数のカウント)。queryoverを使用してこれを行う方法がわかりません。次のようなデータが与えられた場合のようになります。

teacher1.Students = [student1,student2,student3] //teacher1's student count is 3
teacher2.Students = [student4]
teacher3.Students = [student5,student6,student7]
teacher4.Students = [student8]
teacher5.Students = [] //empty

次のようなクエリ結果が必要です。

[
[0,1], //1 teacher has 0 students
[1,2], 
[3,2] //2 teachers have 3 students
]

更新:SQLは次のようになります:

select tc.tCount, count(tc.TRID)
from (select tr.Id as TRID, count(std.Id) as tCount
from Teacher tr
JOIN Student std on std.TeacherId = tr.Id
GROUP BY tr.Id ) as tc GROUP BY tc.tCount
4

1 に答える 1

7
            MyDTO myDTO = null;
            Student studentAlias = null;
            Teacher teacherAlias = null;
            var results = _session.QueryOver<Teacher>(()=>teacherAlias)
               .JoinAlias(x=>x.Students,()=>studentAlias, JoinType.LeftOuterJoin)
               .SelectList(list => list
                  .SelectGroup(m => m).WithAlias(() => myDTO.Teacher)
                  .SelectCount(m => studentAlias.Id).WithAlias(() => myDTO.Count)
               )
               .TransformUsing(Transformers.AliasToBean<MyDTO>())
               .List<MyDTO>();

DTO:

public class MyDTO{
   public Teacher Teacher {get;set;} //or just name or whatever you need
   public int Count {get;set;}
}
于 2012-05-16T10:07:57.487 に答える