2009-08-14 3 views
3

안녕하세요 저는 asp.net에서 데이터 테이블을 사용하고 있습니다. 데이터 테이블에서 고유 한 데이터를 필터링 할 수있는 방법을 얻지 못했습니다.ASP.NET : 데이터 테이블에서 고유 한 행 필터링

문제는 제 1 및 제 2 칼럼에 도포 필터 출력에 기초하여 다음과 같은 것이

Data Table: 
Consumer No Date    Value 
ABC001   1st Aug 09 1 
ABC001   1st Aug 09 2 
ABC001   2nd Aug 09 1 
XYZ001   1st Aug 09 1 
XYZ002   1st Aug 09 1 
XYZ002   1st Aug 09 2 

이하 설명한다. 출력에서 첫 번째와 두 번째 열의 고유 한 조합이 있음을 알 수 있습니다.

Consumer No Date    
ABC001   1st Aug 09 
ABC001   2nd Aug 09 
XYZ001   1st Aug 09 
XYZ002   1st Aug 09 

데이터 테이블에 필터를 적용하려면 어떻게해야합니까?

+0

중복 된 것을 제거하고 반복 할 수 없습니까? –

+0

안녕하세요, 반복 할 필요가 없습니다. phoenix/Preets 답장을 읽어주십시오. 그것은 나를 도울 수 –

답변

10
yourdataset.Tables["TableName"].DefaultView.ToTable(true,"disticecolumn"); 

작성하고 기존 DataView를의 행을 기반으로 새 DataTable을 을 반환합니다.

.ToTable 메서드에서 true는 반환 된 DataTable에 모든 열에 대해 고유 한 값이있는 행이 포함되도록 지정합니다.

기사 msdn에서

편집 :

당신이 '별개의'키워드를 사용할 수있는 데이터베이스에서이 작업을 수행하는 것이 더 쉽습니다.

0
private static DataTable SelectDistinct(DataTable SourceTable, params string[] FieldNames) 
{ 
    object[] lastValues; 
    DataTable newTable; 
    DataRow[] orderedRows; 

    if (FieldNames == null || FieldNames.Length == 0) 
      throw new ArgumentNullException("FieldNames"); 

    lastValues = new object[FieldNames.Length]; 
    newTable = new DataTable(); 

    foreach (string fieldName in FieldNames) 
      newTable.Columns.Add(fieldName, SourceTable.Columns[fieldName].DataType); 

    orderedRows = SourceTable.Select("", string.Join(", ", FieldNames)); 

    foreach (DataRow row in orderedRows) 
    { 
      if (!fieldValuesAreEqual(lastValues, row, FieldNames)) 
      { 
       newTable.Rows.Add(createRowClone(row, newTable.NewRow(), FieldNames)); 

       setLastValues(lastValues, row, FieldNames); 
      } 
    } 

    return newTable; 
} 

private static bool fieldValuesAreEqual(object[] lastValues, DataRow currentRow, string[] fieldNames) 
{ 
    bool areEqual = true; 

    for (int i = 0; i < fieldNames.Length; i++) 
    { 
      if (lastValues[i] == null || !lastValues[i].Equals(currentRow[fieldNames[i]])) 
      { 
       areEqual = false; 
       break; 
      } 
    } 

    return areEqual; 
} 

private static DataRow createRowClone(DataRow sourceRow, DataRow newRow, string[] fieldNames) 
{ 
    foreach (string field in fieldNames) 
      newRow[field] = sourceRow[field]; 

    return newRow; 
} 

private static void setLastValues(object[] lastValues, DataRow sourceRow, string[] fieldNames) 
{ 
    for (int i = 0; i < fieldNames.Length; i++) 
      lastValues[i] = sourceRow[fieldNames[i]]; 
} 

소스 : http://weblogs.asp.net/eporter/archive/2005/02/10/370548.aspx

+0

고마워 ala, 피닉스와 Preets의 대답은 또한 중대하다. 한 줄의 명령문을 사용하여 출력을 얻을 수 있습니다. –

3

당신이 선택() DataTable의 방법에 DISTINCT 필터를 적용 할 수 있습니다 분명히 방법은 없습니다.

그러나 다음 코드 줄을 사용하여 새 DataTable의를 만들 수 있습니다

DataTable filterTable = yourDataTable.DefaultView.ToTable("TargetTable", true, "Consumer", "No", "Date"); 

이 별개의 행을 반환해야합니다, 그것은 당신의 요구 사항을 충족!

신용 한도 : DevPinoy.org!

+1

신용은 msdn으로 이동해야합니다. – rahul

+0

물론!내 Google 검색이 DevPinoy에 착륙했습니다. – Preets

+0

안녕하세요, Phoenix와 Preets 모두에게 감사드립니다. 또한 내 신용은 당신이 내 목적지의 경로가되기 때문에 당신에게갑니다. 다시 한 번 감사드립니다. –

0

이 같은 뭔가를 LINQ를 사용할 수 있습니다

var resultSet = (from r in dt.AsEnumerable() 
    select r["ConsumerNo"]).Distinct().ToList(); 

감사합니다 .... 게시물을 Using LINQ to manipulate DataTable's data

최고의 RGDS

0
DataTable filteredTable = yourDataTable.DefaultView.ToTable("TargetTable", true, "Consumer", "No", "Date"); 
이 코드는 내 요구 사항을 충족

를 참조하십시오! 많이!

관련 문제