.NET MVC 5 запросов моделей, которые имеют много-ко-многим отношения с ApplicationUser

У меня есть занятия Student а также Class,

public class Student : ApplicationUser
{
    public DateTime DateBorn     { get; set; }
    public virtual ICollection<Class> Classes { get; set; }
}

public class Class
{
    public int Id { get; set; }
    public int CourseId { get; set; }
    public Course Course { get; set; }
    public string ProfessorId { get; set; }
    public Professor Professor { get; set; }
    public short Size { get; set; }
    public int Year { get; set; }
    public Term Term { get; set; }
    public bool Enrollable { get; set; }
    public virtual ICollection<Student> Students { get; set; }
}

Я пытаюсь получить Classes в котором Student зачислен. Я думал об использовании метода class.Students.Contains() внутри метода .Where(), но это возвращает мне исключение.

// GET: Classes/Calendar
public async Task<ActionResult> Calendar(int? year, Term? term)
{
    year = year ?? DateTime.Now.Year;
    term = term ?? (Term)(DateTime.Now.Month / 4);

    var student = await UserManager.FindByIdAsync(User.Identity.GetUserId());

    var classes = db.Classes
                .Where(c => c.Students.Contains(student) && c.Year == year && c.Term == term);

    return View(await classes.ToListAsync());
}

Исключение: Unable to create a constant value of type 'Demosthenes.Core.Models.Student'. Only primitive types or enumeration types are supported in this context.

Как я могу сделать это правильно, без необходимости писать явное соединение?

2 ответа

Решение

Если свойство первичного ключа Student является Id а также User.Identity.GetUserId() тип возврата совпадает с Student::IdВы можете попробовать это.

var id = User.Identity.GetUserId();
var classes = db.Classes
   .Where(c => c.Students.Any(s => s.Id == id) 
               && c.Year == year && c.Term == term);

Вы должны сделать шаг назад и изменить структуру таблицы.

Для отношения "многие ко многим" необходимо добавить соединительную таблицу посередине, например

Student
StudentClass
Class

Твой код потом станет

var classes = db.Classes
            .Where(c => c.StudentClasses
                         .Any(x=>x.StudentId == student.Id) 
                     && c.Year == year && c.Term == term);
Другие вопросы по тегам