LINQ 쿼리 오류: "API.Models.PersonProtocol 유형의 상수 값을 생성할 수 없습니다. 이 컨텍스트에서는 기본 유형 또는 열거 유형만 지원됩니다."
이 문서에서는 SELECT 절에서 API.Models.PersonProtocol 유형의 상수 값을 생성하려고 시도하여 발생한 LINQ 쿼리 오류를 해결합니다. 이 컨텍스트에서는 기본 유형 또는 열거 유형만 상수로 허용됩니다.
문제는 다음 코드 줄에 있습니다.
<code class="language-csharp">personProtocol = (ICollection<personprotocol>) ppCombined .Where(a => a.personId == x.personId) .Select( b => new PersonProtocol() { personProtocolId = b.personProtocolId, activateDt = b.activateDt, personId = b.personId })</code>
여기서 ppCombined
는 메모리에 있는 PersonProtocolType
객체들의 집합입니다. 데이터베이스에서 검색된 데이터와 직접 연결할 수 없습니다.
솔루션
이 오류를 해결하려면 ppCombined
의 필터링 및 매핑 작업을 SELECT 절 외부로 이동해야 합니다. 수정된 코드는 다음과 같습니다.
<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>
이 수정된 쿼리에서는 ppCombined
컬렉션이 먼저 메모리에서 필터링 및 매핑되어 필요한 PersonProtocol
개체를 가져옵니다. 그런 다음 결과는 PersonDTO
객체의 personProtocol
속성에 할당됩니다. ppCombined
이후에 AsEnumerable()
처리를 이동하여 데이터베이스 쿼리에서 메모리 내 컬렉션 사용을 방지합니다. AsEnumerable()
데이터베이스 쿼리 결과를 메모리 컬렉션으로 변환하고 이후의 모든 작업은 메모리에서 수행되므로 원래의 오류가 해결됩니다.
위 내용은 내 LINQ 쿼리가 '… 유형의 상수 값을 생성할 수 없습니다.'라는 메시지와 함께 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!