2010-07-30 6 views
4

LINQ 질문이 있습니다. 나는 linq와 위대하지 않습니다. 나는 두 개의 클래스가 있습니다LINQ가 고유 한 결과 집합과 결합합니다.

[Person] 
string FirstName {get;set;} 
string LastName {get;set;} 
IEnumerable<State> LastName {get;set;} 

[State] 
int StateID {get;set;} 
string StateName {get;set;} 

나는 모든 "사람"클래스 상태의 별개의 목록을 반환 것 LINQ 쿼리를 작성하려합니다. SQL의 예제는

SELECT DISTINCT s.StateID 
FROM Person p 
JOIN States s ON (p.StateID = s.StateID) 

입니다.이 문제에 대한 도움을 주시면 감사하겠습니다. 이처럼

답변

5

, 당신은 당신이 (고유하려는 클래스에 IEqualityComparer 인터페이스), 당신은 당신이 될 것 참조하고 당신의 별개의 선택을받을 다음 방법을 구현해야 호출 할 수

IEnumerable<Person> people = GetPeople(); 
people.SelectMany((person) => person.LastName).Distinct(); 

SelectMany는()는 IEnumerable을하지 않습니다 그래서 enumerables을 unioning 결과를 평평하게 <는 IEnumerable < 주 > >하지만, 얻을 IEnumerable을 < 주 >

IEqualityComparer를 구현할 때 Distinct()가 Equals()의 결과를 모두 유효화하고 GetHashCode()의 결과가 동일 함을 알 수 있습니다. 귀하의 경우에는 State 클래스에 비교자를 구현하려고합니다.

public class State : IEqualityComparer<State> 
{ 
    int StateID {get;set;} 
    string StateName {get;set;} 

    public bool Equals(State x, State y) { return x.StateID == y.StateID && x.StateName == y.StateName; } 
    public int GetHashCode(State obj) { return obj.StateId; } 
} 

이 기억, 당신의 별개의()는 IEqualityComparer를 구현하지 않는 경우에 당신을 위해 아무것도 할 것입니다 :

는 다음과 같이 보일 수 있습니다.

+0

감사합니다, 당신은 이미 언급 한 바와 같이 열쇠는 자신의 구현을 만드는 것입니다. – TheWebGuy

1

: 올바르게 State 클래스 EqualsGetHashCode를 구현해야합니다

people.SelectMany(p => p.States).Distinct(); 

참고. (LINQ-to-SQL 또는 엔터티를 사용하지 않는 경우)

ID 만 있으면 Equals/GetHashCode을 구현할 필요가 없습니다. 당신은 단순히 서로 다른 Linq에 성가신입니다

people.SelectMany(p => p.States).Select(s => s.StateId).Distinct(); 
2

이 시도 : 회신에 대한

var stateList = (from s in context.States 
      join p in context.Persons on s.StateId equals p.StateId 
      select s).Distinct(); 
관련 문제