2012-05-14 6 views
0

심각하게, 나는 간단한 것을 놓치고 있어야합니다. 어떤 도움이라도 대단히 감사하겠습니다.IQueryable vs IEnumerable ... 확장 메서드

다음은 시나리오입니다. 1) 적절한 서명 (IQueryable, int x, int y)을 사용하여 DoSomething이라는 IQueryable 확장 메서드를 만듭니다. 2) IQueryable과 동일한 서명을 사용하여 DoSomething이라는 IEnumerable 확장 메서드를 만듭니다. 단, IQueryable 대신 IEnumerable을 수락하거나 반환하는 것을 제외하고는. 3) IEnumerable 확장 메서드 내에서 열거 형을 Queryable (AsQueryable)로 변환하고 IQueryable.DoSomething 메서드를 호출 해보십시오.

위의 시나리오는 IQueryable 대신 IEnumerable 확장 메서드를 재귀 적으로 호출하는 것으로 나타납니다. 나는 왜 그런지 이해하지 못한다.

IQueryable은 IEnumerable을 확장한다는 것을 알고 있습니다. 그러나 .NET 확장은 올바르게 감지하고 작동하는 것 같습니다. 예를 들어, variable.AsQueryable(). Intellisense (및 ReSharper)를 통해 적어도 Take (1)는 Enumerable 확장이 아닌 Queryable 확장을 호출합니다. 필자가 직접 작성하면 작동하지 않는 것처럼 보이고 무한 루프가 생성됩니다.

+0

귀하의 질문에 조금 낡은 소식이 있습니다. 모든 업데이트? 전체 예제를 제공하면이를 따라 움직일 수 있습니다. – DannyMeister

답변

0

대답은 당신이 잘 설명했듯이 효과가 있다고 생각합니다. 여기에 내 작은 LINQPad 테스트 프로그램이 있습니다. 분명히이 시나리오는 내가 void를 반환하고 매개 변수를 취하지 않기 때문에 설명하는 것보다 약간 간단합니다.

void Main() 
{ 
    int[] numbers = { 1, 2, 3, 4, 5 }; 
    numbers.AsQueryable().DumpLast<int>(); 
    numbers.DumpLast<int>(); 
} 

public static class TestExtensions 
{ 
    public static void DumpLast<T>(this IQueryable<T> list) 
    { 
     list.Last<T>().Dump(); 
    } 

    public static void DumpLast<T>(this IEnumerable<T> list) 
    { 
     list.AsQueryable().DumpLast<T>(); 
    } 
} 

출력 : 좀 더 구체적인 예를 제공 할 수있는 경우

5 
5 

어쩌면 우리가이 문제를 일으키는 자리 수있는 일이있다.