Database 实体框架查询特定科目的学生成绩

Database 实体框架查询特定科目的学生成绩,database,entity-framework,linq,Database,Entity Framework,Linq,我有3个实体: 学生 学生与学科班级之间存在多对多关系,学科等级与学生等级之间存在一对多关系 学生成绩的原因:有一种情况,我希望显示一个学生的所有成绩,而不考虑科目。对于科目等级:并非每个科目都使用相同的等级,例如一个科目使用1-10等级,另一个科目使用1-100等级 然而,我想展示的是:例如,学生1在数学课上的所有成绩 我在想,我应该首先获得一个用户的所有分数,然后过滤我想要的类。或者我应该联接所有表,然后筛选StudentID和SubjectID 所以我的最终问题是,怎样做这个查询?首先,调

我有3个实体: 学生

学生与学科班级之间存在多对多关系,学科等级与学生等级之间存在一对多关系

学生成绩的原因:有一种情况,我希望显示一个学生的所有成绩,而不考虑科目。对于科目等级:并非每个科目都使用相同的等级,例如一个科目使用1-10等级,另一个科目使用1-100等级

然而,我想展示的是:例如,学生1在数学课上的所有成绩

我在想,我应该首先获得一个用户的所有分数,然后过滤我想要的类。或者我应该联接所有表,然后筛选StudentID和SubjectID


所以我的最终问题是,怎样做这个查询?

首先,调整你的成绩。成绩取决于学生和学科之间的交叉点。i、 e

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>);
db.Student.Include(“Grade.Subject”).Include(“Grade.Subject”).FirstOrDefault(s=>s.Id==);
您可能知道,M-M联接需要一个“联接”表。在本例中,可以使用Grades作为M-M联接表。因此,我还将删除学生和科目之间的导航属性。它可以通过目标表和您使用的查询来实现。反向查询(班级中的学生):

db.Subject.Include(“Grade.Student”).Include(“Grade.Student”).FirstOrDefault(s=>s.Id==);

首先,调整你的成绩。成绩取决于学生和学科之间的交叉点。i、 e

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>);
db.Student.Include(“Grade.Subject”).Include(“Grade.Subject”).FirstOrDefault(s=>s.Id==);
您可能知道,M-M联接需要一个“联接”表。在本例中,可以使用Grades作为M-M联接表。因此,我还将删除学生和科目之间的导航属性。它可以通过目标表和您使用的查询来实现。反向查询(班级中的学生):

db.Subject.Include(“Grade.Student”).Include(“Grade.Student”).FirstOrDefault(s=>s.Id==);

通常使用EF,您只需编写查询,让它找出在SQL中实现查询的最有效方法。它不再经常出错了。我会修改这个设计。显式创建“StudentSubject”桥接表。在那里添加分数参考。@对不起,我把问题部分弄糟了。我在写实际的查询时遇到了麻烦。@SteveGreene你是说创建一个StudentSubject,让学生和科目有一对一的关系,并为成绩添加某种关系?是的。Student和Subject与该表都有1:M的关系,如EF所描述的,您只需编写查询并让它找出在SQL中实现它的最有效方法。它不再经常出错了。我会修改这个设计。显式创建“StudentSubject”桥接表。在那里添加分数参考。@对不起,我把问题部分弄糟了。我在写实际的查询时遇到了麻烦。@SteveGreene你是说创建一个StudentSubject,让学生和科目有一对一的关系,并为成绩添加某种关系?是的。学生和受试者都与该表有1:M的关系,如前所述。我修改了我的成绩等级,现在似乎更容易查询。然而,我特别想要达到的是:得到主观性=X和StudentID=Y的所有分数。你能帮我吗?当然,db.Student.Include(“grades”).Include(“Grade.Subject”).FirstOrDefault(s=>s.Id==Y和&s.Grade.Subject.SubjectId==X);事实上,你可以让这更简单。db.Grades.Include(学生),Include(学科),FirstOrDefault(p=>p.StudentId==y和p.SCUDENTID==x)谢谢。它说我不能引用这部分的学生:&&s.Grade.Subject.SubjectId==X);因为iif ICollection不包含主题的定义。然而我认为这是因为我使用IQueryable,我想我必须使用其他东西来工作。无论如何,我认为你的解决方案会起作用。我修改了我的年级类,看起来更容易理解现在查询。然而,我特别想实现的是:获取主观性Id==X和StudentID==Y的所有成绩。你能帮我吗?当然,db.Student.Include(“成绩”).Include(“成绩.科目”).FirstOrDefault(s=>s.Id==Y和&s.Grade.Subject.SubjectId==X);实际上你可以简化.db.grades.Include.Include(“学生”),Include(学生),Include(学生),Include(“Subject”).FirstOrDefault(p=>p.StudentId==y和&p.SubjectId==x)谢谢。它说我不能引用这部分的学生:&&s.Grade.Subject.SubjectId==X);因为iif ICollection不包含主题的定义。然而我认为这是因为我使用IQueryable,我想我必须使用其他东西来工作。无论如何,我认为你的解决方案会起作用。
db.Student.Include("Grades").Include("Grade.Subject").FirstOrDefault(s => s.Id == <something>);
db.Subject.Include("Grades").Include("Grade.Student").FirstOrDefault(s => s.Id == <something>);