가장 큰 차이점은 IQueryable는 LINQ-to-SQL(LINQ.-to-anything)이 작동하도록 하는 인터페이스이
다. 따라서 쿼리를 더 세분화 IQueryable하면 가능한 경우 해당 쿼리가 데이터베이스에서 실행된
다. IEnumerable 는 LINQ-to-object가 되므로 원래 쿼리와 일치하는 모든 개체가 데이터베이스의 메
모리에 로드되어야 한다.
아래 두 코드를 보면서 차이점을 살펴보자.
IEnumerable<Article> articles = ArticlesService.getArticlesWithEnumerable();
var notcieArticles = articles.Where(a => a.IsNotice);
IQueryable<Article> articles = ArticlesService.getArticlesWithQueryable();
var notcieArticles = articles.Where(a => a.IsNotice);
IQueryable 코드는 공지사항을 선택하기 위해 SQL을 실행한다. IEnumerable코드는 데이터베이스에
서 원래 쿼리를 실행한 다음 메모리에 공지사항을 필터링한다.
이것은 매우 중요한 차이점이며 IQueryable이 많은 경우 데이터베이스에서 너무 많은 행을 반환하지
않도록 할 수 있다. 또 다른 좋은 예는 페이징을 하고 있다면 Take 및 Skip에 IQueryable, 필요한 행의
수를 얻을 것이다. 이 작업을 IEnumerable을 사용한다면 모든 행이 메모리에 로드된다.
IEnumerable과 IQueryable의 주요 차이점은 필터 로직이 실행되는 위치에 관한 것이다. 하나는 클라
이언트 측 (메모리 내)에서 실행되고 다른 하나는 데이터베이스에서 실행된다.
예를 들어 데이터베이스의 사용자에 대해 10,000개의 레코드가 있고 활성 사용자 인 900 개의 레코
드만 있다고 가정하면 이 경우 IEnumerable을 사용하면 먼저 메모리에 10,000개의 레코드를 모두 로