LINQ, Unable to create a constant value of type XXX. Only primitive types or enumeration types are supported in this context

前端 未结 5 633
我寻月下人不归
我寻月下人不归 2020-11-30 01:58

In my application I have Lecturers and they have list of Courses they can teach and when I\'m deleting a course I want to remove connection to lecturers. Here\'s the code:

5条回答
  •  爱一瞬间的悲伤
    2020-11-30 03:00

    If you are using a DbContext, you can query the .Local collection, and the == operator will work also with 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();
        }
    }
    

    The .Local is an ObservableCollection, so you can compare anything you like inside it (not limited to SQL queries which don't support object comparison). Just to make sure you get all your objects in the .Local collection you can call the db.Lecturers.Load() method before calling .Local, which brings all database entries into the Local collection.

提交回复
热议问题