2010-12-10 4 views
3

다음 예외가 발생하는 이유를 찾을 수 없습니다. 어떤 도움이라도 대단히 감사합니다."LINQ to Entities가 메서드를 인식하지 못합니다"SkipWhile이 실패합니다.

// EdcsEntities is derived from System.Data.Objects.ObjectContext 
EdcsEntities db = new EdcsEntities(); 

var query = from i in db.Colleges 
      select i; 

query = query.SkipWhile<College>(x => x.CollegeID != 100); 

List<College> l = query.ToList<College>(); 

예외 : 엔티티

LINQ 메소드 'System.Linq.IQueryable 1[EDCS.ServiceLayer.DataAccess.College] SkipWhile[College](System.Linq.IQueryable 1 EDCS.ServiceLayer.DataAccess.College] System.Linq.Expressions.Expression를 인식하지 못하는 1[System.Func 2 [EDCS.ServiceLayer.DataAccess.College, System.Boolean]]) ' 메서드이며이 메서드는 저장소 식으로 변환 할 수 없습니다.

+0

당신에게 :

물론
query = query.AsEnumerable().SkipWhile(x => x.CollegeID != 100); 

당신은 아마 이런 일을하고 싶지 :

EF에서 SkipWhile를 사용하는 방법은 그냥 호출하기 전에 AsEnumerable()와 개체로 쿼리를 설정하는 것입니다 아마도'SkipWhile' 대신에'Where'를 원할 것입니다. – Gabe

+0

조건이 참인 한 소스의 요소를 무시한 다음 나머지 요소를 반환합니다. – Laura

+0

[이 질문에] 찾을 수 있습니다 (http://stackoverflow.com/questions/9227828/how-to-implement-skipwhile-with-linq-to-sql-without-first-loading-the-whole-list) 유용합니다 . LINQ to SQL이지만 LINQ to Entities에서도 동일하게 작동해야합니다. –

답변

7

SkipWhile을 EF와 함께 사용할 수 없습니다. SQL로 변환하는 좋은 방법이 없기 때문입니다. SQL 쿼리는 순서가없는 집합을 반환하기 때문에 (당신이 ORDER BY을 사용하지 않는다면) 그런 술어를 사용하는 것은 의미가 없으므로 존재하지 않습니다.

query = query.OrderBy(x => x.CollegeId).Where(x => x.CollegeID > 100); 
+1

이 경우'Where'와'SkipWhile'는 전혀 다른 동작을합니다 :'Where'는'CollegeId! = 100'을 가진 모든 요소를 ​​반환하고,'SkipWile'은'CollegeId! = 100' 그리고 소스의 요소들을 무시합니다. 'CollegeId == 100'이 발견되면 나머지 요소를 반환합니다. 위의 예제에서 두 메소드가 같은 결과를 가지고 있다고해도, 다음 중 하나를 사용하면 큰 차이를 만들 수 있습니다 :'query = query.OrderBy (x => x.Name) .Where (x = > x.CollegeID> 100);'query = query.OrderBy (x => x.Name) .SkipWhile (x => x.CollegeID> 100); –

관련 문제