簡體   English   中英

LINQ,無法創建XXX類型的常量值。在此上下文中僅支持基元類型或枚舉類型

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

在我的應用程序中,我有講師,他們有可以教授的課程列表,當我刪除課程時,我想刪除與講師的聯系。 這是代碼:

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集合應該為null或為空。

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

當你傳遞一個也會發生這種情況Func<T, bool>到哪里()的方式來寫喜歡這里的動態條件這里出於某種原因,代表不能轉換為SQL。

如果您沒有指定平等意味着什么,則無法比較復雜類型。

正如異常細節所示,您需要檢查原始值(例如,在您的情況下為Integer)。

最好還是使用Any()方法。

var toRemove = db.Lecturers
     .Where(l => l.Courses.Any(p=>p.Id == courseFromDb.Id)).ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM