2012-01-13 2 views
1

linq 및 C#을 사용하여 데이터 테이블에서 고유 한 레코드를 선택해야하는데 올바른 구문을 얻지 못하는 것 같습니다. 데이터 테이블의 모든 행을 반환하는 다음 코드가 있는데 DISTINCT 행을 반환하는 방법은 무엇입니까?Linq 및 C#을 사용하여 DataTable에서 Distinct를 선택하십시오.

var q = (from dr in dt.AsEnumerable() select dr).Distinct(DataRowComparer.Default); 

을하지만 실제로는 from x in ... select x은 중복, 그래서 우리는 할 수 있습니다 :

DataTable dt = ds.Tables[0]; 
var q = from dr in dt.AsEnumerable() select dr; 

답변

1
(from dr in dt.AsEnumerable() select dr).Distinct(); 
+0

찾을 수 있습니까? 오류 'System.Data.EnumerableRowCollection '에는 'Distinct'에 대한 정의가없고 'System'형식의 첫 번째 인수를 허용하는 확장 메서드가 없습니다. Data.EnumerableRowCollection '찾을 수 있습니다 (using 지시문 또는 어셈블리 참조가 있습니까?) –

+0

위의 74 vc 74 대답은 정확합니다. – Matt

2

우리는 할 수

var q = dt.AsEnumerable().Distinct(DataRowComparer.Default); 

을 그러나 모든 AsEnumerable()는 대부분의 시간을 할 것입니다 , 아무 것도 아니거나 (이미있는 경우) 또는 잠재적으로 느린 일 (별개의 처리가 가능한 경우 b 경우가 있지만

var q = dt.Distinct(DataRowComparer.Default); 

경우 이전 비트 후자 : 에터 곳), 그래서 할 일반적으로 좋습니다.

+0

이것은 필드 값을 기반으로하지 않고 참조로 행을 비교할 것입니다. –

+0

@ vc74 그래, 내가 오버라이드를 언급했지만 이것이 사용 되어야만하는 경우인지 알지 못했습니다. –

+0

걱정할 필요가 없습니다. btw, dt.ROWS.Distinct (DataRowComparer.Default)를 의미합니까? –

7

당신은 데이터 세트에 LINQ를 사용하여 데이터 행을 비교에 DataRowComparer

IEnumerable<DataRow> distinctRows = 
    dt.AsEnumerable().Distinct(DataRowComparer.Default); 

더 많은 정보를 사용해야합니다 이것은 내가 무엇을 참조를 놓친 거지, 나도 이해가 만든 here