В LINQ, не удалось создать постоянное значение типа ХХХ. Только примитивные типы или типы перечислений поддерживается в данном контексте


в моем приложении у меня есть лекторы, и у них есть список курсов, которые они могут преподавать, и когда я удаляю курс, я хочу удалить соединение с лекторами. Вот код:

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: невозможно создать постоянное значение типа Course. В этом контексте поддерживаются только примитивные типы или типы перечислений.

что я делаю не так?

3   51   2012-11-16 00:24:10

3 ответа:

вы не можете использовать Contains С не-примитивных значений. Делай

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

(или поле Id, которое вы используете).

Если вы используете DbContext, вы можете запросить .Локальная коллекция, и оператор == будет работать также с объектами:

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-это ObservableCollection, поэтому вы можете сравнить все, что вам нравится внутри него (не ограничиваясь SQL-запросами, которые не поддерживают сравнение объектов). Просто чтобы убедиться, что вы получите все ваши объекты .Локальную коллекцию можно вызвать в БД.Лекторы.Load () метод перед вызовом .Локальный, который приносит все записи базы данных в локальный коллекция.

The Courses коллекция ниже строки должна быть нулевой или пустой.

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