2012-02-12 2 views

답변

20

귀하는 잘못 알고 있습니다.

IEnumerable은 개체에 Linq를 사용하고 모든 메서드는의 개체 에서 실행됩니다. - IQueryable은 특정 공급자가 제공하는 Linq 확장 메서드의 구현을 사용합니다. 이 경우 (저장소) 나는 Linq 식을 데이터베이스 문에 매핑하는 공급자 일 가능성이 높습니다. 카운트 쿼리 "select count(*) from People"로 데이터베이스 자체, 즉 결정됩니다

IQueryable<People> list = repository.FindAllPeople; 
int count = list.Count(); 

: 당신이 IQueryable를 사용하는 경우 의미

. 이것은 대개 매우 빠릅니다.

IEnumerable을 사용하는 경우 : Linq는 객체 수를 결정하기 위해 컬렉션을 반복하는 동안

IEnumerable<People> list = repository.FindAllPeople; 
int count = list.Count(); 

모든 사람들 인스턴스가 하나의 메모리 하나에 구체화 될 것이다. 이것은 매우 느리고 가능할 때마다 피해야합니다.

는하지 때문에 모든 메소드 호출은 데이터베이스 쿼리 IEnumerable을 사용하는 것이 때로는 피할 수 있지만, 모든 필터링, 가입 및 그룹화가 가능하면, 다음 마지막 단계에서 당신이 AsEnumerable()를 사용할 수있는 된 IQueryable에서 수행해야 매핑 할 수 있습니다 확장 메서드를 IEnumerable 및 Linq 개체를 사용하여 전환 할 수 있습니다.

+0

제 경우는 아니지만 Excel 문서에서 실행 횟수가 성능에 좋지 않습니다. 약 350 행 동안 300-400ms. 그래도 고마워. 왜 그렇게 느린지 이해할 수있게 도와 줬어. –

0
내가 된 IQueryable의 infeasability에 익숙하지 않다

하지만 this blog post이 된 IQueryable는 기본 식에 액세스 할 수 있기 때문에 된 IQueryable 훨씬 더 바람직를 IEnumerable을 나타냅니다 보인다.

이것은 Where 절의 경우에만 관련 될 수 있으며 .Count()에는 영향을주지 않습니다.

관련 문제