LINQ, impossible de créer une valeur constante de type XXX. Seuls les types primitifs ou les types d’énumération sont pris en charge dans ce contexte

Dans ma candidature, j’ai des conférenciers et ils ont une liste de cours qu’ils peuvent enseigner et lorsque je supprime un cours, je veux supprimer la connexion avec les conférenciers. Voici le code:

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(); } } 

mais ça ne marche pas. Je reçois

NotSupportedException: Impossible de créer une valeur constante de type Course . Seuls les types primitifs ou les types d’énumération sont pris en charge dans ce contexte.

Qu’est-ce que je fais mal?

Vous ne pouvez pas utiliser Contains avec des valeurs non primitives. Faire

 Where(l => l.Courses.Select(c => c.CourseId).Contains(courseId) 

(ou le champ Id que vous utilisez).

Si vous utilisez un DbContext, vous pouvez interroger la collection .Local et l’opérateur == fonctionnera également avec des objects:

 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(); } } 

Le .Local est un object ObservableCollection, vous pouvez donc comparer tout ce que vous voulez à l’intérieur (pas limité aux requêtes SQL qui ne supportent pas la comparaison d’object). Juste pour vous assurer que vous obtenez tous vos objects dans la collection .Local, vous pouvez appeler la méthode db.Lecturers.Load () avant d’appeler .Local, qui apporte toutes les entrées de firebase database dans la collection Local.

La collection Courses de la ligne ci-dessous doit être nulle ou vide.

  var toRemove = db.Lecturers .Where(l => l.Courses.Contains(courseFromDb)).ToList();