Entity Framework запрашивает оценку ученика по конкретному предмету - PullRequest
0 голосов
/ 11 июня 2018

У меня есть 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.

Однако я хотел бы отобразить следующее: все оценки ученика 1например, для класса Math.

Я думал, что сначала я должен получить все оценки для пользователя, а затем отфильтровать нужный класс.Или я должен объединить все таблицы, а затем отфильтровать их по StudentID и SubjectID?

Итак, мой последний вопрос: как выполнить этот запрос?

1 Ответ

0 голосов
/ 11 июня 2018

Сначала настройте свой класс.Оценка зависит от пересечения между студентом и предметом.то есть

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>);

Как вы, вероятно, знаете, для соединения MM требуется таблица "соединение",В этом примере вы можете использовать оценки в качестве таблицы соединений MM.Поэтому я бы также удалил свойства навигации между студентами и предметами.Это может быть достигнуто с помощью таблицы целей и используемого вами запроса.Обратный запрос (ученики в классе):

db.Subject.Include("Grades").Include("Grade.Student").FirstOrDefault(s => s.Id == <something>);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...