【问题标题】:Linq Query Exception when filtering data过滤数据时的Linq查询异常
【发布时间】:2014-12-29 07:26:22
【问题描述】:

我想按 traineeid 过滤已注册和未注册的课程。在这里,db Trainee(ID,TraineeName),Course(ID,CourseName),TraineeCourseEnrollment(TraineeID,CourseID,ENrolledDate)中有3个表。我可以简单地查询已注册的课程,但很难查询未注册的课程。这是我的代码...

    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 扩展方法查询此数据的最佳方法。

【问题讨论】:

  • 哪一行抛出异常?
  • foreach (Course unenroll in unenrolled) 这一行出现错误

标签: c# linq linq-to-sql linq-to-entities extension-methods


【解决方案1】:

我认为您的代码中的问题在这里:

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

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

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

【讨论】:

  • 尚未解决 c => !enroller.Contains(c.ID) 应该像这样 c => !enroller.Contains(c) 但它也得到同样的错误
  • 其实这就是问题本身。当您执行 c => !enroller.Contains(c) 时,您正在尝试过滤对象本身,当 linq 将其转换为 sql 时,它无法翻译 c。这正是您得到“在此上下文中仅支持原始类型或枚举类型”的原因。异常,因为 c 不是原始类型,它是一个对象。
  • 您需要按对象的属性过滤数据。在这种情况下,您的对象是 Course。因此,您需要尝试使用课程属性来构建查询。
【解决方案2】:

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

试试这个。

替换,

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-12
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多