프로그래밍 언어/C++

IEnumerable <T> return vs IQueryable<T> return

Rateye 2021. 10. 25. 11:20
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 TakeSkip 을 사용하면 요청 된 행 수만 가져옵니다. IEnumerable<T> 에서이를 수행하면 모든 행이 메모리에로드됩니다.

출처 : https://stackoverflow.com/questions/2876616/returning-ienumerablet-vs-iqueryablet
728x90
반응형