Programing

LINQ, XXX 형식의 상수 값을 만들 수 없습니다.

lottogame 2020. 12. 5. 09:11
반응형

LINQ, XXX 형식의 상수 값을 만들 수 없습니다. 이 컨텍스트에서는 기본 유형 또는 열거 유형 만 지원됩니다.


내 응용 프로그램에는 강사가 있고 그들이 가르 칠 수있는 강좌 목록이 있으며 강좌를 삭제할 때 강사와의 연결을 제거하고 싶습니다. 코드는 다음과 같습니다.

public void RemoveCourse(int courseId)
{
    using (var db = new AcademicTimetableDbContext())
    {
        var courseFromDb = db.Courses.Find(courseId);

        var toRemove = db.Lecturers
                        .Where(l => l.Courses.Contains(courseFromDb)).ToList();

        foreach (var lecturer in toRemove)
        {
            lecturer.Courses.Remove(courseFromDb);
        }

        db.SaveChanges();
    }
}

하지만 작동하지 않습니다. 나는 얻다

NotSupportedException : 유형의 상수 값을 만들 수 없습니다 Course. 이 컨텍스트에서는 기본 유형 또는 열거 유형 만 지원됩니다.

내가 도대체 ​​뭘 잘못하고있는 겁니까?


Contains원시 값이 아닌 값 에는 사용할 수 없습니다 . 하다

Where(l => l.Courses.Select(c => c.CourseId).Contains(courseId)

(또는 사용하는 Id 필드).


DbContext를 사용하는 경우 .Local 컬렉션을 쿼리 할 수 ​​있으며 == 연산자는 개체에서도 작동합니다.

public void RemoveCourse(int courseId)
{
    using (var db = new AcademicTimetableDbContext())
    {
        var courseFromDb = db.Courses.Find(courseId);

        db.Lecturers.Load() //this is optional, it may take some time in the first load

        //Add .Local to this line
        var toRemove = db.Lecturers.Local 
                        .Where(l => l.Courses.Contains(courseFromDb)).ToList();

        foreach (var lecturer in toRemove)
        {
            lecturer.Courses.Remove(courseFromDb);
        }

        db.SaveChanges();
    }
}

.Local은 ObservableCollection이므로 내부에서 원하는 것을 비교할 수 있습니다 (객체 비교를 지원하지 않는 SQL 쿼리에 국한되지 않음). .Local 컬렉션에있는 모든 개체를 가져 오기 위해 .Local을 호출하기 전에 db.Lecturers.Load () 메서드를 호출하여 모든 데이터베이스 항목을 Local 컬렉션으로 가져올 수 있습니다.


Courses아래 줄 컬렉션은 null이거나 비어 있어야합니다.

 var toRemove = db.Lecturers
                        .Where(l => l.Courses.Contains(courseFromDb)).ToList();

당신이 통과 경우에도 발생할 수 있습니다 Func<T, bool>여기에 같은 동적 조건을 작성하는 경우 ()하는 방법으로에 여기 대리자는 SQL로 변환 할 수없는 이유.


동등성에 대한 의미를 지정하지 않은 경우 복합 유형을 비교할 수 없습니다.

예외 세부 사항에서 알 수 있듯이 기본 값 (예 : Integer)을 확인해야합니다.

And better to use Any() method instead.

var toRemove = db.Lecturers
     .Where(l => l.Courses.Any(p=>p.Id == courseFromDb.Id)).ToList();

참고URL : https://stackoverflow.com/questions/13405568/linq-unable-to-create-a-constant-value-of-type-xxx-only-primitive-types-or-enu

반응형