[linq] IQueryable과 IEnumerable의 차이점은 무엇입니까

차이점에 대해 혼란 스럽습니다. .Net을 처음 IEnumerables접했을 때 Linq 확장을 사용하여 쿼리 할 수 ​​있다는 것을 알고 있습니다 . 이것이 무엇 IQueryable이며 어떻게 다릅니 까?


IQueryable [T]와 IEnumerable [T]의 차이점은 무엇입니까?를 참조하십시오 . 이 질문과 겹칩니다.



답변

IEnumerable<T>의 전진 전용 커서를 나타냅니다 T. .NET 3.5이 포함 된 확장 메서드 추가 LINQ standard query operators와 같은를 Where하고 First술어 또는 복용 익명 함수가 필요한 모든 사업자와 함께 Func<T>.

IQueryable<T>동일한 LINQ 표준 쿼리 연산자를 구현하지만 Expression<Func<T>>조건 자와 익명 함수를 허용 합니다. Expression<T>쿼리 가능한 공급자가 구문 분석하고 그에 따라 사용할 수있는 컴파일 된 식 트리, 메서드의 깨진 버전 (필요한 경우 “반 컴파일 된”)입니다.

예를 들면 다음과 같습니다.

IEnumerable<Person> people = GetEnumerablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();

IQueryable<Person> people = GetQueryablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();

첫 번째 블록 x => x.Age > 18에는 익명 메소드 ( Func<Person, bool>)가 있으며 다른 메소드와 마찬가지로 실행할 수 있습니다. 메소드가 리턴 한 값을 사용하여 Enumerable.Where각 사용자에 대해 메소드를 한 번씩 실행합니다 .yieldtrue

두 번째 블록 에는 “Age”속성> 18 “이라고 생각할 수 x => x.Age > 18있는 표현식 트리 ( Expression<Func<Person, bool>>)가 있습니다.

이를 통해 LINQ-to-SQL과 같은 것은 표현식 트리를 구문 분석하고 동등한 SQL로 변환 할 수 있기 때문에 존재할 수 있습니다. 그리고 공급자 IQueryable는 열거 될 때까지 (실제로 구현할 때까지) 실행할 필요가 없으므로 IEnumerable<T>여러 쿼리 연산자 (위의 예에서 WhereFirstOrDefault)를 결합 하여 기본 데이터에 대해 전체 쿼리를 실행하는 방법에 대한 현명한 선택을 할 수 있습니다 SELECT TOP 1SQL에서 사용 하는 것과 같은 소스 .

보다:


답변

실제로 LINQ-to-SQL과 같은 ORM을 사용하는 경우

  • 을 만들면 IQueryable쿼리가 sql로 변환되어 데이터베이스 서버에서 실행될 수 있습니다.
  • 을 만들면 IEnumerable쿼리를 실행하기 전에 모든 행이 객체로 메모리로 가져옵니다.

두 경우 모두 당신이 전화하지 않는 경우 ToList()또는 ToArray()다음 쿼리가 사용될 때마다 실행됩니다, 그래서 말하자면, 당신은이 IQueryable당신은 다음 쿼리는 데이터베이스의 4 배에 대해 실행됩니다 그것에서 4 목록 상자를 입력합니다.

또한 쿼리를 확장하는 경우 :

q.Select(x.name = "a").ToList()

그런 다음 IQueryable생성 된 SQL에는을 포함 where name = "a"하지만 IEnumerable데이터베이스에서 더 많은 역할을 가져 오는 경우 x.name = "a".NET 이 검사를 수행합니다.


답변

“주된 차이점은 IQueryable에 대해 정의 된 확장 메서드는 Func 개체 대신 Expression 개체를 사용한다는 것입니다. 즉,받는 대리자가 호출하는 메서드 대신 식 트리입니다. IEnumerable은 메모리 내 컬렉션으로 작업하기에 적합하지만 IQueryable에서는 데이터베이스 또는 웹 서비스와 같은 원격 데이터 소스의 경우 “

출처 : here


답변

IEnumerable
IEnumerable은 메모리 내 컬렉션 작업에 가장 적합합니다. IEnumerable은 항목간에 이동하지 않으며 앞으로 만 수집됩니다.

IQueryable
IQueryable은 데이터베이스 또는 웹 서비스와 같은 원격 데이터 소스에 가장 적합합니다. IQueryable은 다양한 흥미로운 지연된 실행 시나리오 (예 : 페이징 및 컴포지션 기반 쿼리)를 가능하게하는 매우 강력한 기능입니다.

따라서 메모리 내 컬렉션을 단순히 반복해야하는 경우 IEnumerable을 사용하십시오. Dataset 및 기타 데이터 소스와 같은 컬렉션을 조작해야하는 경우 IQueryable을 사용하십시오.


답변

주요 차이점은 IEnumerable은 모든 요소를 ​​항상 열거하지만 IQueryable은 쿼리를 기반으로 요소를 열거하거나 다른 작업을 수행한다는 것입니다. 쿼리는 Expression (.Net 코드의 데이터 표현)으로, IQueryProvider가 결과를 생성하기 위해 탐색 / 해석 / 컴파일 / 무엇이든해야합니다.

쿼리식이 있으면 두 가지 장점이 있습니다.

첫 번째 장점은 최적화입니다. ‘Where’와 같은 수정자가 쿼리 표현식에 포함되므로 IQueryProvider는 불가능한 최적화를 적용 할 수 있습니다. 공급자는 ‘Where’절로 인해 모든 요소를 ​​반환 한 다음 대부분의 요소를 버리는 대신 해시 테이블을 사용하여 지정된 키가있는 항목을 찾을 수 있습니다.

두 번째 장점은 유연성입니다. 식은 탐색 가능한 데이터 구조이므로 쿼리를 직렬화하여 원격 시스템 (예 : linq-to-sql)으로 전송하는 등의 작업을 수행 할 수 있습니다.


답변

IQueriable은 IEnumerable과 동일하지만 Linq를 사용하여 사용자 지정 쿼리를 구현하는 추가 기능도 제공합니다. MSDN에 대한 설명은 다음과 같습니다. http://msdn.microsoft.com/en-us/library/system.linq.iqueryable.aspx


답변

먼저 IEnumerable은 System.Collections 네임 스페이스에 있으며 IQueryable은 System.Linq 네임 스페이스에 있습니다. List, Array 컬렉션 등과 같은 메모리 내 컬렉션에서 데이터를 쿼리 할 때 IEnumerable을 사용하고 원격 데이터베이스, 서비스와 같은 메모리 부족 컬렉션에서 데이터를 쿼리 할 때 IQueryable을 사용합니다. 데이터베이스에서 데이터를 쿼리하는 동안 IEnumerable은 서버 쪽에서 선택 쿼리를 실행하고 클라이언트 쪽에서 메모리에 데이터를로드 한 다음 데이터를 필터링합니다. 따라서 더 많은 작업을 수행하고 느려집니다. 데이터베이스에서 데이터를 쿼리하는 동안 IQueryable은 모든 필터를 사용하여 서버 측에서 선택 쿼리를 실행합니다. 따라서 작업이 줄어들고 빨라집니다.