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