2013-06-23 90 views
0

在我的應用程序中,我試圖編寫一個ListStudents ActionResult,它只顯示一個列表,其中的ClassroomID等於當前登錄的教師創建的ClassroomID之一。ASP.NET MVC 4,EF和LINQ:爲多對多關係創建特定的LINQ查詢

我相信我需要使用一些LINQ查詢來獲得所需的結果,但是我被卡住了,因爲當教師實體擁有教室ICollection時,我不知道如何處理它。

ListStudents & CreateClassroom我TeacherController

public ActionResult ListStudents() 
{ 
     //This gets the current teachers UserProfile as only users with the teacher role have access to this controller 

     var teacherProfile = db.UserProfiles.Local.SingleOrDefault(u => u.UserName == User.Identity.Name) 
      ?? db.UserProfiles.SingleOrDefault(u => u.UserName == User.Identity.Name); 

     var teacher = db.Teachers.Find(teacherProfile.UserId); 

     //Need query where students ClassroomID needs to be one of the current teachers ClassroomID's 

     return View(students); 
} 

public ActionResult CreateClassroom(Classroom model) 
    { 
     if (ModelState.IsValid) 
     { 
      try 
      { 
       var userProfile = db.UserProfiles.Local.SingleOrDefault(u => u.UserName == User.Identity.Name) 
        ?? db.UserProfiles.SingleOrDefault(u => u.UserName == User.Identity.Name); 

       var classroom = new Classroom 
       { 
        ClassroomName = model.ClassroomName, 
        TeacherID = userProfile.UserId 

       }; 
       db.Classrooms.Add(classroom); 
       db.SaveChanges(); 
      } 
      catch (DataException) 
      { 
       ModelState.AddModelError("", "Something went wrong, try again."); 
      } 
     } 
     return RedirectToAction("ListClassrooms"); 
    }  

模式對於用戶,學生,教師和課堂

public class User 
{ 
    [Key] 
    [Editable(false)] 
    [ForeignKey("UserProfile")] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)] 
    public int UserId { get; set; } 

    public virtual UserProfile UserProfile { get; set; } 

    [Display(Name = "First Name")] 
    [Required(ErrorMessage = "First name is required.")] 
    [MaxLength(50)] 
    public virtual string FirstName { get; set; } 

    [Display(Name = "Last Name")] 
    [Required(ErrorMessage = "Last name is required.")] 
    [MaxLength(50)] 
    public virtual string LastName { get; set; } 
} 

學生

public class Student : User 
{ 
    [ForeignKey("Account")] 
    [Editable(false)] 
    public virtual int AccountID { get; set; } 

    public virtual Account Account { get; set; } 

    [Column("ClassroomID")] 
    [ForeignKey("Classroom")] 
    public virtual int ClassroomID { get; set; } 

    public virtual Classroom Classroom { get; set; } 
} 

教師

public class Teacher : User 
{ 
    public virtual ICollection<Classroom> Classrooms { get; set; } 
} 

課堂

public class Classroom 
{ 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public virtual int ClassroomID { get; set; } 

    [Display(Name = "Classroom Name")] 
    [MaxLength(50)] 
    public virtual string ClassroomName { get; set; } 

    public virtual ICollection<Student> Students { get; set; } 

    [Column("TeacherID")] 
    [ForeignKey("Teacher")] 
    public virtual int TeacherID { get; set; } 

    public virtual Teacher Teacher { get; set; } 
} 

感謝您抽出時間來幫我解決這個問題,我是很新的MVC和我試圖儘可能多的學習,因爲我能夠。

回答

3

分成幾行,使其更容易理解。

var classrooms = db.Classrooms.Where(x => x.TeacherID == teacher.Id).Select(x => x.ClassroomID); 
var students = db.Students.Where(x => classrooms.Contains(x.ClassroomID); 
+0

非常感謝你,完美的工作!我在理解第一個查詢正在做什麼時遇到了一些麻煩。如果你不介意的話,你能否告訴我它正在做什麼? –

+0

您需要查詢的第一件事是教室的集合。一旦你有了這些教室,你就可以看到學生屬於那些教室。在第一個查詢中,我使用WHERE子句獲得了一批教室。從那個集合中,我只關心Ids(這是SELECT子句的作用)。教室變量實際上只是一個整數集合。 – mtm927

+0

非常感謝! –