개발공부/C#

[Effective C#] 아이템 42 : IEnumerable<T> 데이터 소스와 IQueryable<T> 데이터 소스를 구분하라

개발자 찐빵이 2021. 12. 17. 22:22
728x90

IQueryable와 IEnumerable는 거의 동일한 API 정의를 갖기 때문에 상호 교환 가능하다.
하지만 이 두 인터페이스는 동작 방식도 매우 다르고 성능도 차이 난다.

결과값은 동일하지만 동작 방식은 다른 예시

//where 절과 order 절이 모두 결합된 단일의 T-SQL 구문을 만들어서 데이터베이스를 한 번만 호출
var q =
    from c in dbContext.Customers
    where c.City == "London"
    select c;

var finalAnser = from c in q
                    orderby c.Name
                    select c;

일반적인 LINQ to SQL 쿼리.
LINQ to SQL 라이브러리가 모든 쿼리문을 결합하여 단번에 SQL 결과를 생성한다.
IQueryable 기능을 사용한다.
Queryable는 동일한 함수라 하더라도 표현식 트리를 이용하여 처리한다.

표현식 트리: 쿼리 내 동작을 표현하기 위한 데이터 구조

var q =
    (from c in dbContext.Customers
    where c.City == "London"
    select c).AsEnumerable();

var finalAnser = from c in q
                    orderby c.Name
                    select c;

데이터베이스 객체를 IEnumerable 시퀀스로 변경하기 때문에 데이터베이스가 아니라 로컬 컴퓨터에서 더 많은 작업을 수행한다.
Enumerable 확장 메서드는 쿼리식 내의 람다 표현식과 함수 매개변수를 나타내기 위해 델리게이트를 사용한다.
LINQ to Objects 구현체와 델리게이트를 이용해서 수행된다.
지연 평가와 LINQ to SQL 내의 IQueryable를 동시에 사용한다.
대부분의 경우 쿼리 작업을 할 때 IQueryable를 사용하는 게 훨씬 효율적이다.

반응형