메소드를 상점 표현식으로 변환 할 수 없습니다.


89

이 코드가 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의 기능을 확장하는 목록입니다.

누군가이 오류가 발생하는 이유를 설명 할 수 있습니까?

답변:


115

이유 : 의도적으로 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, 지원되지 않는 문제에 대한 해결 방법을 확인하십시오 . (원래 웹 사이트가 다운 되었기 때문에 두 링크 모두 캐시 된 버전입니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.