2011-03-08 6 views
3

다음과 내가 설정 쿼리/결과를 한 경우로를 무시하고 LINQ는 SQL : 지정된 열

from t1 in table1 
join t2 in table2 on t1.ID equals t2.ID 
join t3 in table3 on t2.ID equals t3.ID 
select new MyClass() 
{ 
    ID = t1.ID, 
    Name = t2.Name, 
    Rank = t2.Rank, 
    City = t3.City 
} 

ID | Name | City | Rank 
01 | Test | Fake | 876 
01 | Test | Fake | 755 
02 | Blah | Fake | 765 

.Distinct을 (수행

가) 3 개 레코드를 반환합니다 ... 별개의 행을 선택,하지만 만약 내가 첫 번째와 세 번째 레코드를 원하고 내 결과 집합의 열을 제거하고 싶지 않으십니까? 나는 이런 식으로 뭔가를 할 수 있도록 구분을 할 때 무시하거나, 또는 명시 적으로 뚜렷한에 포함 할 열을 지정하는 방법 ...

// pseudo code 
.Distinct(o => o.Name.FirstOrDefault()) 

나는 그것을 사용하여이 그룹에 의해 할 수 있다고 생각하지만,이 있는가 느리고 지저분 해 보이는 것 같습니다. 특히 너무 많은 행을 제외하지 않으려면 여러 열을 그룹화해야했습니다. 어떤 아이디어? 감사.

답변

5

아니요, Distinct에 대한 동일성을 결정할 프로젝션을 지정할 수 없습니다. (I은 객체에 LINQ를 위해이 작업을 수행하는 확장 메서드를 가지고,하지만 그건 다른 문제입니다.)

난 당신이 First과 가능성이 함께, GroupBy을 사용하는 것이 좋습니다 :

var query = from t1 in table1 
      join t2 in table2 on t1.ID equals t2.ID 
      join t3 in table3 on t2.ID equals t3.ID 
      select new { t1.ID, t2.Name, t2.Rank, t3.City } into tuple 
      group tuple by new { tuple.ID, tuple.Name, tuple.City } into grouping 
      let first = grouping.First() // For convenience 
      select new MyClass 
      { 
       ID = first.ID, City = first.City, 
       Name = first.Name, Rank = first.Rank 
      }; 

참고이 결과는 수 결정적이 아님 - 순위를 무시하고 각 그룹의 첫 번째 항목을 가져 오는 중입니다. 따라서 순위가 ​​876 인 레코드를 얻거나 순위에 755를 얻을 수 있습니다.

나는 이것이 SQL에서 어떻게 보이는지 정확히 알지 못합니다. 그러나 로깅을 통해 확인한 다음 쿼리 프로파일 러를 실행하여 비용이 얼마인지를 확인해야합니다.