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를 사용하는 게 훨씬 효율적이다.
반응형
'개발공부 > C#' 카테고리의 다른 글
[Effective C#] 아이템 45 : 메서드가 실패했음을 알리기 위해서 예외를 이용하라 (0) | 2021.12.20 |
---|---|
[Effective C#] 아이템 43: 쿼리 결과의 의미를 명확히 강제하고, Single()과 First()를 사용해라 (0) | 2021.12.18 |
[Effective C#] 아이템 40 : 지연 수행과 즉시 수행을 구분하라 (0) | 2021.12.15 |
[Effective C#] 아이템 38 : 메서드보다 람다 표현식이 낫다. (0) | 2021.12.13 |
[Effective C#] 아이템 37 : 쿼리를 사용할 때는 즉시 평가보다 지연 평가가 낫다. (0) | 2021.12.12 |