c# - tutorial - sql command entity framework
LINQ, no se puede crear un valor constante de tipo XXX. Solo tipos primitivos o tipos de enumeraciĆ³n son compatibles en este contexto (3)
En mi aplicación tengo profesores y tienen una lista de cursos que pueden enseñar y cuando elimino un curso quiero eliminar la conexión con los profesores. Aquí está el código:
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();
}
}
pero no funciona. yo obtengo
NotSupportedException: no se puede crear un valor constante de tipo
Course
. En este contexto solo se admiten tipos primitivos o tipos de enumeración.
¿Qué estoy haciendo mal?
La colección de Courses
de la línea siguiente debe ser nula o estar vacía.
var toRemove = db.Lecturers
.Where(l => l.Courses.Contains(courseFromDb)).ToList();
No puede usar Contains
valores no primitivos. Hacer
Where(l => l.Courses.Select(c => c.CourseId).Contains(courseId)
(o el campo Id que usa).
Si está utilizando un DbContext, puede consultar la colección .Local, y el operador == también funcionará con objetos:
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 es una ObservableCollection, por lo que puede comparar cualquier cosa que le guste en su interior (no se limita a las consultas SQL que no admiten la comparación de objetos). Para asegurarse de obtener todos sus objetos en la colección .Local, puede llamar al método db.Lecturers.Load () antes de llamar a .Local, que trae todas las entradas de la base de datos a la colección Local.