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
각 사용자에 대해 메소드를 한 번씩 실행합니다 .yield
true
두 번째 블록 에는 "Age"속성> 18 "이라고 생각할 수 x => x.Age > 18
있는 표현식 트리 ( Expression<Func<Person, bool>>
)가 있습니다.
이를 통해 LINQ-to-SQL과 같은 것은 표현식 트리를 구문 분석하고 동등한 SQL로 변환 할 수 있기 때문에 존재할 수 있습니다. 그리고 공급자 IQueryable
는 열거 될 때까지 (실제로 구현할 때까지) 실행할 필요가 없으므로 IEnumerable<T>
여러 쿼리 연산자 (위의 예에서 Where
와 FirstOrDefault
)를 결합 하여 기본 데이터에 대해 전체 쿼리를 실행하는 방법에 대한 현명한 선택을 할 수 있습니다 SELECT TOP 1
SQL에서 사용 하는 것과 같은 소스 .
보다:
실제로 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은 모든 필터를 사용하여 서버 측에서 선택 쿼리를 실행합니다. 따라서 작업이 줄어들고 빨라집니다.
참고 URL : https://stackoverflow.com/questions/2433306/whats-the-difference-between-iqueryable-and-ienumerable
'programing tip' 카테고리의 다른 글
사용하는 방법 ? (0) | 2020.06.15 |
---|---|
Android에서 AsyncTask 및 오류 처리 (0) | 2020.06.14 |
EditText가 포커스를 잃을 때 어떻게 알 수 있습니까? (0) | 2020.06.14 |
MySQL에서 하나의 행을 복사하여 동일한 테이블에 삽입 할 수 있습니까? (0) | 2020.06.14 |
빌드시 코드 4로 명령 복사가 종료되었습니다.-Visual Studio를 다시 시작하면 문제가 해결됩니다. (0) | 2020.06.14 |