2010-07-08 5 views
2

IQueryProvider.Execute 명령을 사용하여 재생 중이며 내 식 트리 프로젝트의 일부인 표현식을 전달 중입니다. 이 명령은 원래 표현식에 따라 OrderedEnumerable 또는 GroupedEnumerable 일 수있는 객체를 다시 제공합니다. GroupBy식이 GroupedEnumerable 개체를 만듭니다. 다음 코드는 GroupedEnumerable 객체를 생성합니다.이 객체는 내가 겪고있는 문제의 예를 보여줍니다.GroupedEnumerable을 캐스팅하는 방법은 무엇입니까?

List<int> numbers = new List<int> { 1, 7, 16, 23, 41, 66 }; 
object grouped = numbers.GroupBy(n => n % 2 == 0); 

이 때 "분류"는 (GroupedEnumerable의) 객체 나는 나에게 그것을 "하는 GetEnumerator"를 호출 할 수 있도록 다른 유형으로 캐스팅 할 수 있습니다. 나는 또한 예를 들어 "foreach"명령과 함께 사용할 수있는 모든 것을 캐스팅 할 수 없습니다. "var"(아래 그림 참조)를 사용하도록 코드를 변경하면 grouped는 이제 OrderedEnumerable 유형입니다. 열거자를 가져 와서 foreach 명령에 사용할 수 있습니다.

List<int> numbers = new List<int> { 1, 7, 16, 23, 41, 66 }; 
var grouped = numbers.GroupBy(n => n % 2 == 0); 

다시 내 식 트리 프로젝트로 돌아가서는 IQueryProvider.Execute 명령은 개체를 반환하지만 개체가 GroupedEnumerable 될 때 OrderedEnumerable에 개체를 캐스팅 할 수 있어야합니다. 내가 시도한 모든 캐스트는 "유형이 'System.Linq.GroupedEnumerable`3 유형의 객체를 ..... 형식으로 변환 할 수 없습니다"라는 오류를 표시합니다. 그 물건을 더 유용한 것으로 던지는 방법을 말해 줄 수있는 사람?

+0

전송 시도 및 정확한 오류를 설명하십시오. –

+0

성취하려는 것은 무엇입니까? 짝수 만 원하면 GroupBy()가 아닌 Where()를 사용해야합니다. – Qwertie

+0

코드 예제는 GroupedEnumerable을 얻는 방법의 예입니다. 내 질문에서 볼 수있는 IQueryProvider.Execute 메서드를 사용하여 실제로 GroupedEnumerable 형식의 개체를 반환합니다. 내 문제는 이것을 주조하고 짝수와는 아무 관련이 없다. – Retrocoder

답변

5

GroupBy 전화의 결과는 IEnumerable<IGrouping<bool, int>>입니다. 두 번째 코드 예제에서 단어 var 위로 마우스를 가져 가면 이것을 볼 수 있습니다. 이 유형으로 전송하면 제대로 작동합니다. 전화의 출력이 GroupedEnumerable<MyEntityItem,int?,MyEntityItem> 경우 위의 설명 후

List<int> numbers = new List<int> { 1, 7, 16, 23, 41, 66 }; 
object grouped = numbers.GroupBy(n => n % 2 == 0); 

IEnumerable<IGrouping<bool, int>> foo = 
    (IEnumerable<IGrouping<bool, int>>)grouped; 

편집

, 당신은 IEnumerable<IGrouping<int?, MyEntityItem>>에 캐스팅 할 수 있습니다.

+0

이런 식으로 캐스트하려고하면 "IEnumerable 에 1 개의 형식 인수가 필요합니다. – Retrocoder

+0

@Retrocoder : 죄송합니다. 답변을 수정했습니다. –

+0

안녕하세요. 좋아, 그래서 지금 내가 원하는 것을 GroupedEnumerable 에 캐스트 캐스트를 가지고있다. 그것에 대해 많은 감사를 드린다. 두 번째 질문을 도와 줄 수있다.이 코드는 IOrderedQueryable 에서 파생되는 클래스의 "IEnumerator GetEnumerator()"메서드에 있습니다. 캐스트가 오류를 throw하면 "GroupedEnumerable "열거자를 반환 할 수 없습니다. – Retrocoder

2

개체를 IEnumerable<T>으로 전송하십시오. 열거 가능한 구현은 중요하지 않습니다.

관련 문제