ASP.NET MVC 4、EF 和 LINQ:为多对多关系创建特定的 LINQ 查询

Posted

技术标签:

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

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

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

我的 TeacherController 中的 ListStudents 和 CreateClas-s-room

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 Clas-s-roomID needs to be one of the current teachers Clas-s-roomID's

        return View(students);


public ActionResult CreateClas-s-room(Clas-s-room 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 clas-s-room = new Clas-s-room
                
                    Clas-s-roomName = model.Clas-s-roomName,
                    TeacherID = userProfile.UserId

                ;
                db.Clas-s-rooms.Add(clas-s-room);
                db.SaveChanges();
            
            catch (DataException)
            
                ModelState.AddModelError("", "Something went wrong, try again.");
            
        
        return RedirectToAction("ListClas-s-rooms");
        

用户、学生、教师和课堂模型

    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("Clas-s-roomID")]
    [ForeignKey("Clas-s-room")]
    public virtual int Clas-s-roomID  get; set; 

    public virtual Clas-s-room Clas-s-room  get; set; 

老师

    public class Teacher : User

    public virtual ICollection<Clas-s-room> Clas-s-rooms  get; set; 

教室

    public class Clas-s-room

    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public virtual int Clas-s-roomID  get; set; 

    [Display(Name = "Clas-s-room Name")]
    [MaxLength(50)]
    public virtual string Clas-s-roomName  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 很陌生,正在努力学习。

【问题讨论】:

【参考方案1】:

分成几行,更容易理解。

var clas-s-rooms = db.Clas-s-rooms.Where(x => x.TeacherID == teacher.Id).Select(x => x.Clas-s-roomID);
var students = db.Students.Where(x => clas-s-rooms.Contains(x.Clas-s-roomID);

【讨论】:

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

以上是关于ASP.NET MVC 4、EF 和 LINQ:为多对多关系创建特定的 LINQ 查询的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC4.0+EF+LINQ+bui+网站+角色权限管理系统

ASP.NET EF(LINQ/Lambda查询)

ASP.NET Mvc开发之EF延迟加载

ASP.NET MVC: EF 没有创建数据库表

如何使用 MVC3 ASP.NET 4.5 和 EF6 基于实体属性注释对 TextBoxFor 进行舍入

ASP.NET 5 和 EF - 用 LINQ 替换子列表