update tutorial query framework espaƱol data consulta c# entity-framework linq

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.