C# 筛选数据时出现Linq查询异常
我想按实习生ID筛选已注册和未注册的课程。在这里,db培训生(ID,培训生姓名)、课程(ID,课程名称)、培训生课程登记表(培训生ID,课程ID,注册日期)中有3个表。我可以简单地查询注册课程,但很难查询未注册课程。这是我的密码C# 筛选数据时出现Linq查询异常,c#,linq,linq-to-sql,linq-to-entities,extension-methods,C#,Linq,Linq To Sql,Linq To Entities,Extension Methods,我想按实习生ID筛选已注册和未注册的课程。在这里,db培训生(ID,培训生姓名)、课程(ID,课程名称)、培训生课程登记表(培训生ID,课程ID,注册日期)中有3个表。我可以简单地查询注册课程,但很难查询未注册课程。这是我的密码 public IEnumerable<CourseDTO> GetCourse(string traineeid, bool isenrolled) { List<Course> enrolled=new Li
public IEnumerable<CourseDTO> GetCourse(string traineeid, bool isenrolled)
{
List<Course> enrolled=new List<Course>();
List<CourseDTO> course_enrolled_dtos= new List<CourseDTO>();
List<CourseDTO> course_unenrolled_dtos = new List<CourseDTO>();
IEnumerable<TraineeCourseEnrollment> enrolled_courses = db.Trainees.Find(traineeid).TraineeCourseEnrollments.ToList();
foreach (TraineeCourseEnrollment enroll in enrolled_courses)
{
course_enrolled_dtos.Add(new CourseDTO() { CourseName = enroll.Course.CourseName, ID = enroll.Course.ID });
enrolled.Add(new Course() { CourseName = enroll.Course.CourseName, ID = enroll.Course.ID });
}
if(isenrolled)
{
return course_enrolled_dtos;
}
else
{
IEnumerable<Course> unenrolled=db.Courses.Except(enrolled);
foreach (Course unenroll in unenrolled)//Exception
{
course_unenrolled_dtos.Add(new CourseDTO() { CourseName = unenroll.CourseName, ID = unenroll.ID });
}
return course_enrolled_dtos;
}
}
public IEnumerable GetCourse(字符串培训生ID,bool isenrolled)
{
已登记列表=新列表();
列出课程\注册\ dtos=新列表();
列表课程\u未滚动\u dtos=新列表();
IEnumerable registered_courses=db.pedients.Find(traineeeid.traineeecourseenrollments.ToList();
foreach(培训课程登记注册课程)
{
课程\注册\添加(新课程到(){CourseName=enroll.course.CourseName,ID=enroll.course.ID});
添加(新课程(){CourseName=enroll.Course.CourseName,ID=enroll.Course.ID});
}
如果(已登记)
{
返回课程(已注册)(dto);;
}
其他的
{
IEnumerable unrolled=db.Courses.除外(已注册);
foreach(课程取消注册未注册)//异常
{
course_unneroll_dtos.Add(new CourseDTO(){CourseName=unneroll.CourseName,ID=unneroll.ID});
}
返回课程(已注册)(dto);;
}
}
此代码给出了一个异常
无法创建“DAL_EF1.Course”类型的常量值。在此上下文中仅支持基元类型或枚举类型
这里有使用Linq扩展方法查询此数据的最佳方法 我认为您代码中的问题在于:
IEnumerable<Course> unenrolled=db.Courses.Except(enrolled);
IEnumerable unrolled=db.Courses.Except(已注册);
您正试图通过对象筛选数据。相反,您可以尝试以下方法:
IEnumerable<Course> unenrolled=db.Courses.Where(c => !enroller.Contains(c.ID)).ToList();
IEnumerable unrolled=db.Courses.Where(c=>!enroller.Contains(c.ID)).ToList();
错误表明实体框架只允许过滤器中的前置类型
试试这个
取代
IEnumerable<Course> unenrolled=db.Courses.Except(enrolled);
IEnumerable unrolled=db.Courses.Except(已注册);
有,
var-enrolledID=enrolled.Select(e=>e.CourseID.ToList();
IEnumerable unrolled=db.Courses.Where(c=>!enrolledID.Contains(c.CourseID));
哪一行引发异常?foreach(课程取消注册未注册)这一行得到一个尚未解决的错误c=>!enroller.Contains(c.ID)应该是这样的c=>!enroller.Contains(c),但它也会出现相同的错误,实际上这就是问题本身。当你做c=>的时候!enroller.Contains(c),您试图通过对象本身进行筛选,当linq将其转换为sql时,它无法转换c。这正是您得到“此上下文中仅支持基元类型或枚举类型”的原因。异常因为c不是基元类型,它是一个对象。您需要按对象的属性筛选数据。在这种情况下,您的对象是“当然”。因此,您需要尝试使用课程属性构建查询。
var enrolledID = enrolled.Select(e => e.CourseID).ToList();
IEnumerable<Course> unenrolled=db.Courses.Where(c => !enrolledID.Contains(c.CourseID));