[.net] IQueryable <T>와 IEnumerable <T>의 차이점은 무엇입니까?

차이점은 무엇이며 IQueryable<T>그리고 IEnumerable<T>?


이 질문과 겹치는 IQueryable과 IEnumerable의 차이점은 무엇입니까?를 참조하십시오 .



답변

우선 , 인터페이스를 확장 하므로 “plain” 으로 수행 할 수있는 모든 작업은 .IQueryable<T> IEnumerable<T>IEnumerable<T>IQueryable<T>

IEnumerable<T>다만이 GetEnumerator()반환 방법 Enumerator<T>당신이 호출 할 수있는 MoveNext()일련의 반복하는 방법을 T를 .

어떤 IQueryable<T>이있다 IEnumerable<T> 하지 않습니다 특히-한 두 가지 속성은있는 포인트 쿼리 제공자 (예를 들어, SQL 공급자에 대한 LINQ)과 또 다른 하나를 가리키는 쿼리 식 표현 IQueryable<T>될 수있는 런타임에 이동 추상 구문 트리로 객체를 주어진 쿼리 공급자가 이해합니다 (대부분의 경우 예외가 발생하지 않고 LINQ to SQL 공급자에게 LINQ to SQL 식을 제공 할 수 없음).

표현식은 단순히 오브젝트 자체의 상수 표현식이거나 구성된 쿼리 연산자 및 피연산자 세트의 더 복잡한 트리 일 수 있습니다. 쿼리 공급자 IQueryProvider.Execute()또는 IQueryProvider.CreateQuery()메서드가 전달 된 Expression 과 함께 호출 된 다음 쿼리 결과 또는 다른 결과 IQueryable가 각각 반환됩니다.


답변

가장 큰 차이점은 델리게이트 대신 객체 를 IQueryable<T>가져 오는 LINQ 연산자 Expression는 예를 들어 조건 자 또는 값 선택기와 같이받는 사용자 지정 쿼리 논리가 메서드에 대한 델리게이트가 아닌 식 트리의 형식임을 의미합니다.

  • IEnumerable<T> 메모리 내에서 반복되는 시퀀스 작업에 유용하지만
  • IQueryable<T> 데이터베이스 또는 웹 서비스와 같은 원격 데이터 소스와 같은 메모리 부족을 허용합니다.

쿼리 실행 :

  • 쿼리 실행이 “in process”에서 수행되는 경우 일반적으로 필요한 것은 쿼리의 각 부분을 실행하는 코드 (코드)입니다.

  • 실행이 프로세스 외부에서 수행 되는 경우 LINQ 공급자가 LDAP 쿼리이든 관계없이 LINQ 공급자가 메모리 부족 실행에 적합한 형식으로 변환 할 수 있도록 쿼리 논리를 데이터로 나타내야합니다. SQL 또는 무엇이든.

더 :

http://www.codeproject.com/KB/cs/646361/WhatHowWhere.jpg


답변

이것은 YouTube 의 멋진 비디오 로서 이러한 인터페이스가 어떻게 다른지 보여줍니다.

아래는 그것에 대한 긴 해답입니다.

기억해야 할 첫 번째 중요한 점은 IQueryable인터페이스가에서 상속 받으 IEnumerable므로 무엇이든 IEnumerable할 수있는 IQueryable것입니다.

여기에 이미지 설명을 입력하십시오

많은 차이점이 있지만 가장 큰 차이점을 만드는 하나의 큰 차이점에 대해 논의하겠습니다. IEnumerableinterface는 LINQ또는 Entity 프레임 워크를 사용하여 컬렉션을로드 하고 컬렉션에 필터를 적용하려는 경우에 유용합니다 .

IEnumerable엔티티 프레임 워크와 함께 사용되는 아래 간단한 코드를 고려하십시오 . 사용하고 Where그 기록을 얻기 위해 필터 EmpId입니다 2.

EmpEntities ent = new EmpEntities();
IEnumerable<Employee> emp = ent.Employees;
IEnumerable<Employee> temp = emp.Where(x => x.Empid == 2).ToList<Employee>();

여기서 필터는 IEnumerable코드가 있는 클라이언트 측에서 실행됩니다 . 즉, 모든 데이터는 데이터베이스에서 가져온 다음 클라이언트에서 EmpIdis로 스캔하고 레코드를 가져옵니다 2.

여기에 이미지 설명을 입력하십시오

그러나 이제 아래 코드가로 변경 IEnumerable되었습니다 IQueryable. 서버 측에서 SQL 쿼리를 작성하고 필요한 데이터 만 클라이언트 측으로 전송합니다.

EmpEntities ent = new EmpEntities();
IQueryable<Employee> emp = ent.Employees;
IQueryable<Employee> temp =  emp.Where(x => x.Empid == 2).ToList<Employee>();

여기에 이미지 설명을 입력하십시오

따라서 필터 로직이 실행되는 위치 IQueryable와 차이 IEnumerable가 있습니다. 하나는 클라이언트 쪽에서 실행되고 다른 하나는 데이터베이스에서 실행됩니다.

따라서 메모리 내 데이터 수집 IEnumerable만 사용하는 것이 좋지만 데이터베이스와 연결된 데이터 수집을 쿼리하려면`IQueryable이 네트워크 트래픽을 줄이고 SQL 언어의 힘을 사용하므로 더 나은 선택입니다.


답변

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

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

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


답변

간단히 말하면 다른 주요 차이점은 IEnumerable이 서버 측에서 선택 쿼리를 실행하고 클라이언트에서 데이터를 메모리에로드 한 다음 데이터를 필터링하는 반면 IQueryable은 모든 필터를 사용하여 서버 측에서 select 쿼리를 실행한다는 것입니다.


답변

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

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

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

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

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

그런 다음 IQueryable을 사용하면 생성 된 SQL에 “where name =”a “가 포함되지만 IEnumerable을 사용하면 데이터베이스에서 더 많은 역할을 가져오고 x.name =”a “검사가 .NET에 의해 수행됩니다.


답변

IEnumerable은 컬렉션을 참조하지만 IQueryable은 쿼리 일 뿐이며 Expression Tree 내에서 생성됩니다.이 쿼리를 실행하여 데이터베이스에서 데이터를 가져옵니다.