В LINQ, не удалось создать постоянное значение типа ХХХ. Только примитивные типы или типы перечислений поддерживается в данном контексте
в моем приложении у меня есть лекторы, и у них есть список курсов, которые они могут преподавать, и когда я удаляю курс, я хочу удалить соединение с лекторами. Вот код:
public void RemoveCourse(int courseId)
{
using (var db = new AcademicTimetableDbContext())
{
var courseFromDb = db.Courses.Find(courseId);
var toRemove = db.Lecturers
.Where(l => l.Courses.Contains(courseFromDb)).ToList();
foreach (var lecturer in toRemove)
{
lecturer.Courses.Remove(courseFromDb);
}
db.SaveChanges();
}
}
но это не работает. Я получаю
NotSupportedException: невозможно создать постоянное значение типа
Course. В этом контексте поддерживаются только примитивные типы или типы перечислений.
что я делаю не так?
3 ответов:
вы не можете использовать
ContainsС не-примитивных значений. ДелайWhere(l => l.Courses.Select(c => c.CourseId).Contains(courseId)(или поле Id, которое вы используете).
Если вы используете DbContext, вы можете запросить .Локальная коллекция, и оператор == будет работать также с объектами:
public void RemoveCourse(int courseId) { using (var db = new AcademicTimetableDbContext()) { var courseFromDb = db.Courses.Find(courseId); db.Lecturers.Load() //this is optional, it may take some time in the first load //Add .Local to this line var toRemove = db.Lecturers.Local .Where(l => l.Courses.Contains(courseFromDb)).ToList(); foreach (var lecturer in toRemove) { lecturer.Courses.Remove(courseFromDb); } db.SaveChanges(); } }The .Local-это ObservableCollection, поэтому вы можете сравнить все, что вам нравится внутри него (не ограничиваясь SQL-запросами, которые не поддерживают сравнение объектов). Просто чтобы убедиться, что вы получите все ваши объекты .Локальную коллекцию можно вызвать в БД.Лекторы.Load () метод перед вызовом .Локальный, который приносит все записи базы данных в локальный коллекция.
The
Coursesколлекция ниже строки должна быть нулевой или пустой.var toRemove = db.Lecturers .Where(l => l.Courses.Contains(courseFromDb)).ToList();
Comments