답변
우선 , 인터페이스를 확장 하므로 “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 또는 무엇이든.
더 :
- LINQ :
IEnumerable<T>
그리고IQueryable<T>
- C # 3.0 및 LINQ .
- ” 반환
IEnumerable<T>
대IQueryable<T>
“ - 소개로 – .NET 및 C # 개발자를위한 반응성 프로그래밍
IEnumerable
,IQueryable
,IObservable
, 및IQbservable
답변
이것은 YouTube 의 멋진 비디오 로서 이러한 인터페이스가 어떻게 다른지 보여줍니다.
아래는 그것에 대한 긴 해답입니다.
기억해야 할 첫 번째 중요한 점은 IQueryable
인터페이스가에서 상속 받으 IEnumerable
므로 무엇이든 IEnumerable
할 수있는 IQueryable
것입니다.
많은 차이점이 있지만 가장 큰 차이점을 만드는 하나의 큰 차이점에 대해 논의하겠습니다. IEnumerable
interface는 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
코드가 있는 클라이언트 측에서 실행됩니다 . 즉, 모든 데이터는 데이터베이스에서 가져온 다음 클라이언트에서 EmpId
is로 스캔하고 레코드를 가져옵니다 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 내에서 생성됩니다.이 쿼리를 실행하여 데이터베이스에서 데이터를 가져옵니다.