문제

차이점이 헷갈리네요..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은 모든 필터를 사용하여 서버 측에서 선택 쿼리를 실행합니다.따라서 작업량이 줄어들고 속도가 빨라집니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top