【问题标题】:ASP.NET MVC 4, EF, & LINQ: Creating a specific LINQ query for a many-to-many relationshipASP.NET MVC 4、EF 和 LINQ:为多对多关系创建特定的 LINQ 查询
【发布时间】:2013-06-20 06:22:04
【问题描述】:

在我的应用程序中,我正在尝试编写一个 ListStudents ActionResult,它只显示一个学生列表,其 ClassroomID 等于当前登录教师创建的 ClassroomID 之一。

我相信我需要使用一些 LINQ 查询来获得所需的结果,但我被卡住了,因为当教师实体有一个 ICollection 教室时,我不太知道如何处理它。

我的 TeacherController 中的 ListStudents 和 CreateClassroom

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 很陌生,正在努力学习。

【问题讨论】:

    标签: asp.net-mvc linq entity-framework asp.net-mvc-4


    【解决方案1】:

    分成几行,更容易理解。

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

    【讨论】:

    • 非常感谢,效果很好!我在理解第一个查询在做什么时遇到了一些麻烦。如果你不介意,你能告诉我它到底在做什么吗?
    • 这个查询首先需要的是教室的集合。一旦你有了这些教室,你就可以看到哪些学生属于这些教室。在第一个查询中,我使用 WHERE 子句获取了一个教室集合。从那个集合中,我只关心 Id(这是 SELECT 子句发挥作用的地方)。教室变量实际上只是整数的集合。
    猜你喜欢
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多