2010-06-21 5 views
0

반응 프레임 워크를 살펴보기 시작했습니다. 아주 좋은 물건. 그러나 코드 샘플을 보면서 혼란 스럽습니다. linq 구문은 IQueryable과 함께 작동합니다. linq은 IEnumerable에서만 작동한다고 생각했습니다. C# 컴파일러는 확장 메서드 변환에 linq을 기반으로 무엇입니까? 특정 인터페이스와 함께 일련의 메소드가 필요합니까?Rx 프레임 워크에서 linq 구문이 IQueryable 인터페이스에서 작동하는 방식

+0

LINQ는 항상 IQueryable 및 IEnumerable에서 작동합니다. –

답변

5

아닙니다. 이것은 단지 통사론적인 번역 일뿐입니다. 예를 들어, 컴파일러는이 번역됩니다

var query = from item in source 
      select item.Property; 

그것은 않습니다

var query = source.Select(item => item.Property); 

에 그 Select 방법에 대해 아무것도 모른 채. 번역을 수행 한 다음 번역 된 코드를 컴파일하려고 시도합니다.

모든 번역은 C# 4 사양의 7.16 절 (그리고 이전 버전의 해당 내용)에 자세히 설명되어 있습니다.

Rx의 경우에는 IObservable<T>IQbservable<T>의 내선 번호를 호출합니다. Parallel Extensions의 경우에는 ParallelQuery<T>에있는 확장 메소드를 호출합니다.

일부 미친 물건을 함께 할 수 있습니다 - 나는 blog post 몇 가지 예제를 제공합니다. 여기에 또 다른 홀수 일이다 :

using System; 
using System.Linq; 

namespace CornerCases 
{ 
    class WeirdQueryExpression 
    { 
     static WeirdQueryExpression Where(Func<int, int> projection) 
     { 
      return new WeirdQueryExpression { Select = ignored => "result!" }; 
     } 

     Func<Func<string, bool>, string> Select { get; set; } 

     static void Main() 
     { 
      string query = from x in WeirdQueryExpression 
          where x * 3 
          select x.Length > 10; 

      Console.WriteLine(query); 
     } 
    } 
} 

쿼리로 변환 다음을 반환 Where 속성 액세스에 이어 WeirdQueryExpression를 돌려 고정 방법, 호출 인

WeirdQueryExpression.Where(x => x * 3) 
        .Select(x => x.Length > 10); 

... Func<Func<string, bool>, string>. 그런 다음 을 호출하여 다른 대표를 전달하고 결과를 query에 할당하는으로 호출합니다.

펑키, 응?

+1

OP를 돕기 위해 LINQ를 추가하면 Queryable 클래스를 통해 IQueryable의 확장 메서드가 검색됩니다. http : //msdn.microsoft.com/en-us/library/system.linq.queryable.aspx –

관련 문제