LINQ,无法创buildtypes为XXX的常量值。 在此上下文中仅支持基本types或枚举types

在我的应用程序中,我有讲师,他们有他们可以教的课程列表,当我删除课程时,我想删除与讲师的联系。 代码如下:

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:无法创buildtypes为Course的常量值。 在此上下文中仅支持基本types或枚举types。

我究竟做错了什么?

您不能将Contains与非原始值一起使用。 做

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

(或您使用的Id字段)。

如果您正在使用DbContext,则可以查询.Local集合,并且==运算符也可以与对象一起使用:

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

.Local是一个ObservableCollection,所以你可以比较你喜欢的任何内容(不限于不支持对象比较的SQL查询)。 只要确保在.Local集合中获得所有对象,就可以在调用.Local之前调用db.Lecturers.Load()方法,该方法将所有数据库条目都带入Local集合中。

下面的Courses集合应该是null或者空的。

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