2008-10-29 7 views
8

나는 Lambda에 대해 더 많은 연습을하지만, 나는 때때로 IQueryable을 사용하는 .AsQueryable();을 사용하고 언젠가 .AsQueryable();을 생략하고 IEnumerable을 사용하는 이유를 알지 못한다.IQueryable <T> vs IEnumerable <T> 람다 (선택 대상)?

나는 MSDN을 읽었으나 "표현식 트리 실행"이 장점이 아니라는 것을 알지 못합니다.

누구나 내게 설명 할 수 있습니까?

답변

6

IQueryable은 IEnumerable을 구현하므로 IQueryable을 사용하면 방망이에서 IEnumerable로 수행 할 수있는 모든 작업을 수행 할 수 있습니다. IQueryables는 일부 람다 식을 기본 데이터 소스의 쿼리로 변환하는 것을 처리합니다.이 쿼리는 SQL 데이터베이스 나 개체 집합이 될 수 있습니다.

기본적으로 IQueryable 또는 IEnumerable 인 경우 일반적으로 한 가지 방법 또는 다른 방법으로 처리하지 않아야합니다.

6

사용자는 일반적으로 신경 쓸 필요가 없습니다. 실제로 데이터 소스의 구현 자입니다. 데이터 공급자가 IEnumerable을 구현하는 경우 기본적으로 개체 실행에 LINQ를 수행합니다. 즉 컬렉션에 대한 메모리 작업에 있습니다. IQueryable은 표현식이 실행되면 Linq2Sql, Linq2Xml 및 Linq2Entities가 수행하는 식 (일반적으로 열거 형)에 따라 표현식 트리를 대체 표현으로 변환하는 기능을 데이터 소스에 제공합니다.

IQueryable이 Expression을 노출하므로 최종 사용자가 돌볼 수있는 유일한 시간은 실행될 Expression 트리를 검사 할 수 있는지 여부입니다. 또 다른 용도는 공급자를 검사하는 것입니다. 그러나이 두 시나리오는 다른 쿼리 공급자의 구현자를 위해 예약되어 있어야하며 식을 변환하려고합니다. Linq의 요점은 사용되는 표현식 실행의 구현에 신경 쓰지 말아야한다는 것입니다.

1

나는 Arne Claassen에 동의하며, 데이터 소스가 제공하는 기본 구현에 대해 생각할 필요가있는 경우가 있습니다. 예를 들어, blog post을 확인하면 특정 시나리오에서 IEnumerable 및 IQueryable에 의해 생성 된 SQL이 다른 방식을 보여줍니다.