2013-03-28 2 views
0

를 사용하여 DataTable의에서 같은 특정 열 내용 레코드를 얻는 방법 : 사용나는 이런 식으로 뭔가 보이는 개인 데이터가있는 테이블이 LINQ

Identifier Name Phone Address 
............................. 
    1  aa 23 abc 
    2  bb 22 abd 
    2  cc 11 aaa 
    3  dd 44 amd 
    4  fa 33 agd 
    2  ds 14 dad 
    3  as 55 fgg 

나는 동일한 식별자를 가진 레코드를 얻으려면을 LINQ는, 다음, 나는 식별자에 의해 주문하고 새로운 DataTable을 복사 할 수이

Identifier Name Phone Address 
............................. 
    2  bb 22 abd 
    2  cc 11 aaa 
    2  ds 14 dad 
    3  dd 44 amd 
    3  as 55 fgg 

같은 것을 얻을 그것을 분석하고 동일한 식별자를 가진 레코드를 얻을 수 있지만, 내가 생각 비싼 것입니다. 더 짧은 길이 있습니까? 감사합니다.

+0

몇 가지 코드를 알려주시겠습니까? 너 뭐 해봤 니? 'datatable'이라고 말하면 'System.Data.DataTable'을 참조하고 있습니까? 또는 귀하가 제공 한 형식의 데이터가있는 텍스트 파일입니까? – IAbstract

+0

예, System.Data.DataTable입니다. 그것이 크고 완전히 다른 컬럼을 가지고 있기 때문에 나는 코드를 게시하지 않았다. 나는 이미 중복 된 데이터를 추출한 다음 데이터 테이블간에 차이를 만들 생각을했지만, 그럴 수 없었다. 답변 해주셔서 감사합니다. – darkdante

답변

2

아래와 같은 코드는 동일한 스키마가있는 새 DataTable에 중복 된 내용을 필터링하고 추출합니다. 코드 Identifierint입니다. 적절한 이름과 유형으로 교체하십시오.

var extractedDuplicates = (from row in table.AsEnumerable() 
          group row by row.Field<int>("Identifier") into rows 
          where rows.Count() > 1 
          from row in rows 
          select row).CopyToDataTable(); 

당신에게 얼마나 멀리 있는지 알아보십시오. 복사 할 행이 없으면 CopyToDataTable()이 던져 버리기 때문에 중복이없는 경우 여러 문으로 분할해야합니다.

var duplicateRows = from row in table.AsEnumerable() 
        group row by row.Field<int>("Identifier") into rows 
        where rows.Count() > 1 
        from row in rows 
        select row; 

DataTable extractedDuplicates; 
if (duplicateRows.Any()) 
    extractedDuplicates = duplicateRows.CopyToDataTable(); 
else 
    extractedDuplicates = table.Clone(); 

그리고, 당신은 새로운 DataTable에 필요하지 않은 경우 물론, 완전히이 코드의 제 2 부분을 생략하고 바로 duplicateRows와 함께 작동합니다.

-1
select * from YourTable a where a.Identifier in 
(
    select aa.Identifier from YourTable aa group by aa.Identifier 
    having (count(aa.Identifier) > 1) 
) 
+0

이것은 LINQ가 아닙니다. – IAbstract

관련 문제