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

时间:2018-06-11 17:23:00

标签: database entity-framework linq

我有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 个答案:

答案 0 :(得分: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连接表。所以我也会删除学生和学生之间的导航属性。主题。它可以通过目标表和您使用的查询来实现。反向查询(班级中的学生):

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