LINQ,无法创建类型为XXX的常量值。 Only primitive types or enumerati

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

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的常量值。 只有原始类型或枚举类型在此上下文中受支持。

我究竟做错了什么?


您不能将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集合应为空或空白。

 var toRemove = db.Lecturers
                        .Where(l => l.Courses.Contains(courseFromDb)).ToList();
链接地址: http://www.djcxy.com/p/85321.html

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

下一篇: Instantiation and Initialization of Value Types vs. Reference Types