2016-12-31 10 views
3

を失っている私は、次のモデルがあります:適用するグループが

public class Course 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class Course_TutionCenter 
{ 
    public int Id { get; set; } 
    public int CourseId { get; set; } 
    public int TutionCenterId { get; set; } 

    [ForeignKey("CourseId")] 
    public virtual Course Course { get; set; } 

    [ForeignKey("TutionCenterId")] 
    public virtual TutionCenter TutionCenter { get; set; } 
} 

public class CourseStudent 
{ 
    public int Id { get; set; } 
    public int Course_TutionCenter_Id { get; set; } 

    [ForeignKey("Course_TutionCenter_Id")] 
    public virtual Course_TutionCenter Course_TutionCenter { get; set; } 
} 

各コースは、多くのCourse_TutionCenterに教示され、各コースに分散している多くのCourseStudentを持つことができますいくつかCourse_TutionCenter。

私ができない持って

CourseId、コース名、Tutionセンター募集このコースの数、全てTutionセンターの上に、このコースを受講する学生数:

私は、単一のLINQクエリで、次のデータを必要とします1つのLINQクエリを使用してこのデータをフェッチする必要があります。なぜなら、(CourseおよびCourse_TutionCenter)の参加でCourse over Groupを適用すると、すべてのTution Centerでの合計学生数を取得するための情報が失われるからです。 Courseを介してグループを申請した後のいくつかのTution CentreのID。CourseおよびCourse_TutionCenterの参加時に

これは単一のLINQクエリを使用して行うことができますか?

私は次のようなものは、あなたが探しているものはないと思います

答えて

2

:(

var result = from course in DbCourses 
      left join courseTutionCenter in DbCourseTutionCenter 
      on course.Id equals courseTutionCenter.CourseId 
      left join courseStudent in DbCourseStudent 
      on courseStudent.Course_TutionCenter_Id equals courseTutionCenter.TutionCenterId 
      group by new { course.Id, course.Name } into gr 
      select new 
      { 
       CourseId = gr.Key.Id, 
       CourseName = gr.Key.Name, 
       TutionCenters = gr.GroupBy(x=>x.courseStudent.Course_TutionCenter_Id).Count(), 
       Students = gr.GroupBy(x=>x.courseStudent.Id).Count() 
      }; 
+0

留学センターや学生がいないコースも含まれます。ジョインの両方の場所に左ジョインを配置すると機能するはずです。私は正しい? – teenup

+0

@teenup correct :) – Christos

2

私が意図した結果を記述し、最も自然な方法でLINQクエリを記述しますし、ORMが私のためにSQL生成を処理させますジョインまたは必要なものを使用して)。 IMO何GroupByを必要としない、あなたの場合は

Courseテーブルで始まる(既にグループ化された情報が含まれている)だけフィルタリングのためのナビゲーションプロパティを使用して他のテーブルから必要な集計を取る:これはしません

var query = db.Course.Select(c => new 
{ 
    CourseId = c.Id, 
    CourseName = c.Name, 
    NumberOfTutionCenters = db.Course_TutionCenter 
     .Count(tc => tc.CourseId == c.Id), 
    NumberOfStudents = db.CourseStudent 
     .Count(s => s.Course_TutionCenter.CourseId == c.Id), 
}); 
+0

このクエリのパフォーマンスは、グループ化されたクエリのパフォーマンスと等しくなりますか? – teenup

+0

良い質問です。それはあなたが測定すべきものです。しかし、適切なインデックス(FKの関係には通常存在する)を使うと、それはかなり良いと思う。 –

関連する問題