IEnumerable
상수 수집
다른 JOIN 문의 SELECT 문 내에서 LINQ JOIN 절을 사용할 때 "API.Models.PersonProtocol 유형의 상수 값을 생성할 수 없습니다. 이 컨텍스트에서는 기본 유형 또는 열거 유형만 지원됩니다."라는 오류가 발생합니다. 이 오류는 IEnumerable
컬렉션ppCombined
을 데이터베이스 컨텍스트에서 상수 값으로 사용할 수 없기 때문에 발생합니다.
제공된 코드에서:
<code class="language-csharp">var persons = db.Favorites .Where(x => x.userId == userId) .Join(db.Person, x => x.personId, y => y.personId, (x, y) => new PersonDTO { personId = y.personId, addressId = y.addressId, favoriteId = x.favoriteId, personProtocol = (ICollection<PersonProtocol>) ppCombined .Where(a => a.personId == x.personId) .Select( b => new PersonProtocol() { personProtocolId = b.personProtocolId, activateDt = b.activateDt, personId = b.personId }) });</code>
이 코드는 db.Favorites
및 db.Person
테이블의 데이터를 연결한 다음 그 결과를 PersonDTO
개체에 투영하려고 시도합니다. PersonDTO
개체 내에는 personProtocol
컬렉션에 대한 LINQ 쿼리 결과로 설정된 ppCombined
속성이 있습니다.
문제는 데이터베이스 컨텍스트에서 ppCombined
을 상수 값으로 사용하려고 하는 것입니다. ppCombined
은 데이터베이스 테이블이 아닌 메모리에 구성된 IEnumerable
객체입니다. LINQ 쿼리를 실행할 때 personProtocol
프로젝션을 SQL 문으로 변환하려고 시도합니다. 그러나 ppCombined
은 데이터베이스 테이블이나 기본 유형이 아니기 때문에 이를 수행할 수 없습니다.
솔루션
이 오류를 해결하려면 데이터베이스에서 다른 속성을 검색한 후 메모리의 ppCombined
에서 필터링된 항목을 가져올 수 있습니다. 수정된 코드는 다음과 같습니다.
<code class="language-csharp">var persons = db.Favorites .Where(f => f.userId == userId) .Join(db.Person, f => f.personId, p => p.personId, (f, p) => new // 匿名对象 { personId = p.personId, addressId = p.addressId, favoriteId = f.favoriteId, }) .AsEnumerable() // 数据库查询在此结束,其余部分是在内存中进行的查询 .Select(x => new PersonDTO { personId = x.personId, addressId = x.addressId, favoriteId = x.favoriteId, personProtocol = ppCombined .Where(p => p.personId == x.personId) .Select(p => new PersonProtocol { personProtocolId = p.personProtocolId, activateDt = p.activateDt, personId = p.personId }) .ToList() });</code>
이 수정된 코드에서 데이터베이스 쿼리는 AsEnumerable()
메서드로 끝납니다. 이는 나머지 작업이 전적으로 메모리에서 수행된다는 의미입니다. 그런 다음 익명 개체의 메모리 기반 Select
프로젝션에서 ppCombined
컬렉션을 필터링하고 목록으로 변환합니다.
데이터베이스 쿼리를 메모리 내 처리와 분리함으로써 메모리 내 컬렉션을 데이터베이스 컨텍스트에 전달하는 문제를 방지하여 버그를 해결합니다.
위 내용은 IEnumerable 상수 컬렉션을 사용하여 LINQ JOIN에서 '상수 값을 만들 수 없습니다' 오류를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!