이 코드가 LINQ to SQL에서 작동하는 것을 보았지만 Entity Framework를 사용할 때 다음 오류가 발생합니다.
LINQ to Entities는 ‘System.Linq.IQueryable’1 [MyProject.Models.CommunityFeatures] GetCommunityFeatures ()’메서드를 인식하지 못하며이 메서드는 저장소 식으로 변환 할 수 없습니다 .`
저장소 코드는 다음과 같습니다.
public IQueryable<Models.Estate> GetEstates()
{
return from e in entity.Estates
let AllCommFeat = GetCommunityFeatures()
let AllHomeFeat = GetHomeFeatures()
select new Models.Estate
{
EstateId = e.EstateId,
AllHomeFeatures = new LazyList<HomeFeatures>(AllHomeFeat),
AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat)
};
}
public IQueryable<Models.CommunityFeatures> GetCommunityFeatures()
{
return from f in entity.CommunityFeatures
select new CommunityFeatures
{
Name = f.CommunityFeature1,
CommunityFeatureId = f.CommunityFeatureId
};
}
public IQueryable<Models.HomeFeatures> GetHomeFeatures()
{
return from f in entity.HomeFeatures
select new HomeFeatures()
{
Name = f.HomeFeature1,
HomeFeatureId = f.HomeFeatureId
};
}
LazyList는 IQueryable의 기능을 확장하는 목록입니다.
누군가이 오류가 발생하는 이유를 설명 할 수 있습니까?
답변
이유 :
의도적으로 LINQ to Entities 에서는 전체 LINQ 쿼리 식을 서버 쿼리로 변환해야합니다. 쿼리가 번역되기 전에 몇 가지 상관되지 않은 하위 식 (서버의 결과에 의존하지 않는 쿼리의 식) 만 클라이언트에서 평가됩니다. 이 경우 GetHomeFeatures ()와 같이 알려진 번역이없는 임의의 메서드 호출은 지원되지 않습니다.
보다 구체적으로 LINQ to Entities는 매개 변수없는 생성자 와 이니셜 라이저 만 지원 합니다 .
솔루션 :
따라서이 예외를 극복하려면 GetCommunityFeatures () 및 GetHomeFeatures ()에 대한 기본 쿼리에 하위 쿼리를 병합해야합니다.LINQ 쿼리 내에서 직접 메서드를 호출하는 대신. 또한 LINQ to SQL 에서했던 것처럼 매개 변수가있는 생성자를 사용하여 LazyList 의 새 인스턴스를 인스턴스화하려는 줄에 문제 가 있습니다 . 이를 위해 솔루션은 LINQ 쿼리 (LINQ to Objects)의 클라이언트 평가로 전환하는 것입니다. 이렇게 하려면 LazyList 생성자를 호출하기 전에 LINQ to Entities 쿼리에 대해 AsEnumerable 메서드 를 호출해야합니다 .
public IQueryable<Models.Estate> GetEstates()
{
return from e in entity.Estates.AsEnumerable()
let AllCommFeat = from f in entity.CommunityFeatures
select new CommunityFeatures {
Name = f.CommunityFeature1,
CommunityFeatureId = f.CommunityFeatureId
},
let AllHomeFeat = from f in entity.HomeFeatures
select new HomeFeatures() {
Name = f.HomeFeature1,
HomeFeatureId = f.HomeFeatureId
},
select new Models.Estate {
EstateId = e.EstateId,
AllHomeFeatures = new LazyList<HomeFeatures>(AllHomeFeat),
AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat)
};
}
추가 정보 : LINQ to Entities를 살펴보십시오. 지원되지 않는 것은 무엇입니까? 더 많은 정보를 위해서. 또한 가능한 솔루션에 대한 자세한 설명 은 LINQ to Entities, 지원되지 않는 문제에 대한 해결 방법을 확인하십시오 . (원래 웹 사이트가 다운 되었기 때문에 두 링크 모두 캐시 된 버전입니다.)