首页 文章

实体框架查询特定主题的学生成绩

提问于
浏览
0

我有3个实体:学生

public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual ICollection<Subject> Subjects { get; set; }
    public virtual ICollection<Grade> Grades { get; set; }

学科

public int SubjectID { get; set; }
    public string SubjectName { get; set; }       
    public virtual ICollection<Student> Students { get; set; }
    public virtual ICollection<Grade> Grades { get; set; }

等级

public int GradeID { get; set; }
    public string GradeName { get; set; }
    public int GradeValue { get; set; }

学生和学科课程之间存在多对多关系,学生成绩和学生成绩之间存在一对多关系 .

学生成绩的原因:有一种情况,我想要所有成绩的学生,无论是否显示主题 . 对于学科成绩:并非每个科目使用相同的比例,例如一个科目使用1-10比例,另一个使用1-100比例 .

我想要展示的是:例如,所有student1的数学课程成绩 .

我在想我应该先为用户获得所有成绩,然后过滤我想要的课程 . 或者我应该加入所有表格,然后筛选StudentID和SubjectID?

所以我的终极问题是,如何进行此查询?

1 回答

  • 2

    首先,调整您的成绩课程 . 成绩取决于学生和主题之间的交集 . 即

    public int GradeID { get; set; }
    public string GradeName { get; set; }
    public int GradeValue { get; set; }    // -1 = class in progress
    public int StudentId { get; set; }
    public virtual Student Student { get; set; }
    public int SubjectId { get; set; }
    public virtual Subject Subject { get; set; }
    

    EF将生成密钥,因为您具有导航路径,但依赖于推断的密钥而不是显式密钥,如果默认行为发生更改(通常情况下),则易于破坏 . 此外,您可以控制键的命名 .

    至于查询,您可以使用:

    db.Student.Include("Grades").Include("Grade.Subject").FirstOrDefault(s => s.Id == <something>);
    

    您可能知道,M-M连接需要一个“连接”表 . 在此示例中,您可以使用Grades作为M-M连接表 . 所以我也会删除学生和主题之间的导航属性 . 它可以通过目标表和您使用的查询来实现 . 反向查询( class 中的学生):

    db.Subject.Include("Grades").Include("Grade.Student").FirstOrDefault(s => s.Id == <something>);
    

相关问题