2014-12-29 103 views
1

我想通过traineeid过滤已注册和未注册的课程。在这里有数据库学员(ID,TraineeName),课程(ID,课程名称),TraineeCourseEnrollment(TraineeID,CourseID,ENrolledDate)3表。我可以简单地查询已注册的课程,但很难查询未注册的课程。这里是我的代码...过滤数据时Linq查询异常

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; 
     } 




    } 

此代码给人一种异常

无法创建类型的常量值“DAL_EF1.Course”。只有原始类型或枚举类型在此上下文中受支持。

在这里有什么最好的方式来使用Linq扩展方法来查询这些数据。

+2

哪条线抛出异常? – MarcinJuraszek

+0

foreach(课程在未注册时取消注销)此行出现错误 –

回答

1

我想在你的代码的问题是在这里:

IEnumerable<Course> unenrolled=db.Courses.Except(enrolled); 

您试图通过对象来过滤数据。相反,你可以尝试这样的事情:

IEnumerable<Course> unenrolled=db.Courses.Where(c => !enroller.Contains(c.ID)).ToList(); 
+0

尚未解决c =>!enroller.Contains(c.ID)应该与此类似c =>!enroller.Contains(c)但它也会得到相同的错误 –

+1

其实这是问题本身。当你做c =>!enroller.Contains(c)时,你试图通过对象本身进行筛选,当linq将它转换为sql时,它无法翻译c。这正是您获得的原因“在此上下文中仅支持基本类型或枚举类型。”因为c不是原始类型,所以它是一个对象。 – gkc

+0

你能告诉我怎样才能解决这个问题。 –

0

错误表明实体框架只允许过滤器中的前置类型。

试试这个。

更换,

IEnumerable<Course> unenrolled=db.Courses.Except(enrolled); 

用,

 var enrolledID = enrolled.Select(e => e.CourseID).ToList(); 
     IEnumerable<Course> unenrolled=db.Courses.Where(c => !enrolledID.Contains(c.CourseID));