2010-02-26 4 views
11

elementat(Int32) 메서드를 사용하여 쿼리 결과의 특정 요소를 가져옵니다.LINQ to Entities가 ElementAt (i) 메서드를 인식하지 못합니다.

var mds = db.TDP_MissioniDestinazioni.Where(p => p.MissioneID == missioneRow.MissioneID); 

destinazioneRow = mds.ElementAt(i); 

있어서 'TimeEntModel.TDP_MissioniDestinazioni ElementAt [TDP_MissioniDestinazioni]
(System.Linq.IQueryable`1 [TimeEntModel.TDP_MissioniDestinazioni, INT32)'방식을 인식하지 못하는 엔티티 LINQ 및 이 방법은 상점 표현으로 변환 할 수 없습니다.

왜이 오류가 발생하며 어떻게 해결할 수 있습니까?

답변

20

"이전"결과를 모두 가져 오시겠습니까? 그렇다면 ToList()을 호출하거나 AsEnumerable()을 호출하여 호출 할 때마다 AsEnumerableQueryable.ElementAt 대신 Enumerable.ElementAt을 호출하도록 컴파일러를 강제하는 방법입니다.

더 좋은 방법이있을 수 있습니다 (예 : Take 또는 Skip 사용) - 더 큰 그림에 대한 자세한 정보를 제공 할 수 있습니까?

16

당신은 단순히 Skip 혼합 할 수 및 First 트릭 할 :

mds.Skip(i).First() 
+2

@Steven : 그에 대한 번역이 mds.Skip (I - 1)과 비교 될 것 같은 어떤 생각 좁은 방을()? –

+1

@ 존 : EF가 이와 같은 SQL 코드를 생성했으면 좋겠지 만 필자의 'mds.Skip (.-1) .First()'가보다 효율적인 SQL을 생성 할 것이라고 추측합니다. 좋은 분! – Steven

+6

'.ElementAt (i)'가 0으로 시작하기 때문에'i-1' 대신'.Skip (i)'를 사용해야한다고 생각합니다. 따라서'.ElementAt (0)'과 같은 것은'.Skip 0) .First()'. 나는 거의 3 년 늦었다. –

관련 문제