728x90
반응형
질문 : IEnumerable 반환 대 IQueryable
IQueryable<T>
반환과 IEnumerable<T>
반환의 차이점은 언제 하나를 다른 것보다 선호해야합니까?
IQueryable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;
IEnumerable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;
둘 다 연기 된 실행이며 언제 하나가 다른 것보다 선호되어야합니까?
답변
예, 둘 다 연기 된 실행 을 제공합니다.
차이점은 IQueryable<T>
는 LINQ-to-SQL (LINQ.-to-anything)이 작동 할 수 있도록하는 인터페이스라는 것입니다. IQueryable<T>
에서 쿼리를 추가로 구체화하면 가능한 경우 해당 쿼리가 데이터베이스에서 실행됩니다.
IEnumerable<T>
경우 LINQ-to-object가됩니다. 즉, 원래 쿼리와 일치하는 모든 개체를 데이터베이스에서 메모리로로드해야합니다.
코드에서 :
IQueryable<Customer> custs = ...;
// Later on...
var goldCustomers = custs.Where(c => c.IsGold);
이 코드는 골드 고객 만 선택하기 위해 SQL을 실행합니다. 반면에 다음 코드는 데이터베이스에서 원래 쿼리를 실행 한 다음 메모리에서 골드가 아닌 고객을 필터링합니다.
IEnumerable<Customer> custs = ...;
// Later on...
var goldCustomers = custs.Where(c => c.IsGold);
이것은 매우 중요한 차이점이며 IQueryable<T>
작업을하면 대부분의 경우 데이터베이스에서 너무 많은 행을 반환하지 않아도됩니다. 또 다른 대표적인 예는 페이징을 수행하는 것입니다. IQueryable
Take
및 Skip
을 사용하면 요청 된 행 수만 가져옵니다. IEnumerable<T>
에서이를 수행하면 모든 행이 메모리에로드됩니다.
출처 : https://stackoverflow.com/questions/2876616/returning-ienumerablet-vs-iqueryablet
728x90
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
rvalues, lvalues, xvalues, glvalues, prvalues 사용 방법 (0) | 2021.11.11 |
---|---|
[C++] private, public 및 protected 상속의 차이점 (0) | 2021.11.04 |
대소 문자를 구분하지 않는 'Contains (string)' (0) | 2021.10.25 |
콘솔 앱의 'Main'메서드에서 'async' 수정자를 지정하는 방법 (0) | 2021.10.15 |
C++ 에서 bool에 대한 printf 포맷 지정자 (0) | 2021.09.28 |