![](/img/trans.png)
[英]Unable to create a constant value of type 'xxx'. Only primitive types or enumeration types are supported in this context
[英]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.