2011-03-21 9 views
3

내가 가지고있는 고객는 IEnumerable <dynamic> LINQ 식

지금은 그 목록에서 disctinct 회사 이름을 갖고 싶어 IEnumerable<Customer>의 동적 목록?

은 내가

dynamic cur = (from c in result.Customers 
         select g.CompanyName).Distinct(); 

같은 일을 할 수 있다고 생각하지만 ... 가 어떻게이 같은 쿼리를 구축 할 수없는 오늘을 배웠다?

+0

var를 사용할 수 없습니까? – Manatherin

답변

4

만큼 Customer 클래스 멤버 CompanyName을 가지고, 당신은 확실히 다음을 수행 할 수 있습니다 : 그것은 방지 할 수 있다는 사실이 아닌 여기 var 통해 dynamic 키워드를 사용하는 어떠한 장점은 없다

var companies = (from c in result.Customers 
       select c.CompanyName).Distinct(); 

컴파일러 오류가 나타나지 않습니다.

+1

그럴 수 없습니다 : '동적'소스 유형 또는 '동적'유형의 조인 순서를 통한 쿼리 표현은 허용되지 않습니다. –

+0

그러면 더 많은 컨텍스트를 제공해야한다고 생각합니다. '결과'란 무엇입니까? 'result.Customers' 란 무엇입니까? – jdmichal

+2

내 잘못 IEnumerable 대신 동적 인 반환했습니다 그 이유는 내가 예외가있어 ... 그것은 모든 동적 한숨 ... 덕분에 어쨌든 ... 감사합니다 @ 그의. 캐스팅 () 나를 생각하게 ...하지만 @jdmichal이 discribed, 감사합니다처럼 작동하지 않습니다 ... –

5

코드에서 수행중인 작업과 질문 제목에서 묻는 작업은 서로 다릅니다.

당신은 당신이 다음을 수행해야합니다 IEnumerable<dynamic>하려면 다음

IEnumerable<dynamic> cur = (from c in result.Customers 
       select g.CompanyName).Cast<dynamic>().Distinct(); 

from c in result.Customers select g.CompanyName 반환 IEnumerable<string>.
Cast<dynamic>()IEnumerable<dynamic>을 반환합니다.
Distinct()은 열거 가능한 멤버를 반환합니다.

Distinct()은 기본적으로 기본 동일성 비교 자 EqualityComparer<T>을 사용합니다. 이것은 열거 된 유형을 검사하고이를 처리하는 방법을 알아 내려고합니다 (링크에서 이에 대해 자세히 설명 함).

동적으로 처리되는 유형을 기본 동등 비교 자로 처리 할 수없는 경우를 제외하고이 모든 항목은 보급 된대로 작동합니다. 이 경우 사용자 정의 동등 비교자를 사용하는 재정의를 사용해야합니다.

+0

좋은 설명. 그리고 링크에 감사드립니다. –