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


답변:


186

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에서 사용 하는 것과 같은 소스 .

보다:


1
꽤 간단한 답변
ashveli

83

실제로 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 이 검사를 수행합니다.


"쿼리가 sql로 변환 될 수 있습니다": 'may may'를 얻지 못했습니다. 또한 IEnumerable이 있고 IQueryable과 달리 '복잡한 체인'을 만드는 경우 '최적화 된'SQL 쿼리로 변환되지 않습니다. '모든 행을 메모리로 가져옵니다'라고 말할 때의 의미를 확인하고 싶습니다. 두 개의 where 절이 있다고 가정하면 엔터티의 모든 튜플을 먼저 메모리로 가져오고 정상적인 '메모리 내'필터링이 발생합니까?
Vaibhav

36

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

출처 : here


19

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

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

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


11

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

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

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

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



1

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

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