IQueryable과 IEnumerable의 차이점은 무엇입니까?
-
19-09-2019 - |
문제
차이점이 헷갈리네요..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
.
두 번째 블록에서는 x => x.Age > 18
표현식 트리(Expression<Func<Person, bool>>
), 이는 "'Age' 속성 > 18"로 간주될 수 있습니다.
이를 통해 식 트리를 구문 분석하고 이를 동등한 SQL로 변환할 수 있기 때문에 LINQ-to-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 개체를 사용한다는 것입니다. 즉, IQueryable이 수신하는 대리자는 호출할 메서드가 아닌 식 트리입니다.IEnumerable은 메모리 내 컬렉션 작업에 적합하지만 IQueryable은 데이터베이스나 웹 서비스와 같은 원격 데이터 소스를 허용합니다."
원천: 여기
IEnumerable IEnumerable은 메모리 내 컬렉션 작업에 가장 적합합니다.IEnumerable은 항목 간에 이동하지 않으며 전달 전용 컬렉션입니다.
쿼리 가능IQueryable은 데이터베이스나 웹 서비스와 같은 원격 데이터 소스에 가장 적합합니다.IQueryable은 다양하고 흥미로운 지연 실행 시나리오(예: 페이징 및 구성 기반 쿼리)를 가능하게 하는 매우 강력한 기능입니다.
따라서 단순히 메모리 내 컬렉션을 반복해야 하는 경우 IEnumerable을 사용하고, 데이터 세트 및 기타 데이터 소스와 같은 컬렉션을 조작해야 하는 경우 IQueryable을 사용하세요.
원칙적인 차이점은 IEnumerable은 항상 모든 요소를 열거하는 반면, IQueryable은 쿼리를 기반으로 요소를 열거하거나 심지어 다른 작업도 수행한다는 것입니다.쿼리는 IQueryProvider가 결과를 생성하기 위해 탐색/해석/컴파일하는 등 무엇이든 탐색해야 하는 표현식(.Net 코드의 데이터 표현)입니다.
쿼리 표현식을 사용하면 두 가지 이점이 있습니다.
첫 번째 장점은 최적화입니다.'Where'와 같은 수정자가 쿼리 표현식에 포함되어 있으므로 IQueryProvider는 다른 방법으로는 불가능한 최적화를 적용할 수 있습니다.모든 요소를 반환한 다음 'Where' 절로 인해 대부분을 버리는 대신 공급자는 해시 테이블을 사용하여 지정된 키가 있는 항목을 찾을 수 있습니다.
두 번째 장점은 유연성입니다.표현식은 탐색 가능한 데이터 구조이기 때문에 쿼리를 직렬화하여 원격 시스템으로 보내는 등의 작업을 수행할 수 있습니다(예:linq-to-sql).
IQueriaable은 IEnumerable과 동일하지만 Linq를 사용하여 사용자 지정 쿼리를 구현하는 추가 기능도 제공합니다.MSDN에 대한 설명은 다음과 같습니다. http://msdn.microsoft.com/en-us/library/system.linq.iqueryable.aspx
먼저 IEnumerable은 System.Collections 네임스페이스에 있고 IQueryable은 System.Linq 네임스페이스에 있습니다.목록, 배열 컬렉션 등과 같은 메모리 내 컬렉션에서 데이터를 쿼리할 때 IEnumerable을 사용하고 메모리 외부(예: 원격 데이터베이스, 서비스) 컬렉션에서 데이터를 쿼리할 때는 IQueryable을 사용합니다.왜냐하면 데이터베이스에서 데이터를 쿼리하는 동안 IEnumerable은 서버 측에서 선택 쿼리를 실행하고 클라이언트 측 메모리에 데이터를 로드한 다음 데이터를 필터링하기 때문입니다.따라서 더 많은 작업을 수행하고 속도가 느려집니다.데이터베이스에서 데이터를 쿼리하는 동안 IQueryable은 모든 필터를 사용하여 서버 측에서 선택 쿼리를 실행합니다.따라서 작업량이 줄어들고 속도가 빨라집니다.