2014-12-29 97 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));