Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 筛选数据时出现Linq查询异常_C#_Linq_Linq To Sql_Linq To Entities_Extension Methods - Fatal编程技术网

C# 筛选数据时出现Linq查询异常

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

我想按实习生ID筛选已注册和未注册的课程。在这里,db培训生(ID,培训生姓名)、课程(ID,课程名称)、培训生课程登记表(培训生ID,课程ID,注册日期)中有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;
        }




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