본문 바로가기
C#/c#

[C#] DataTable에서 특정 Row만 추출하기

by izen8 2021. 11. 9.
반응형

DataTable에서 특정 Row만 추출하는 경우가 존재합니다.

DataTable.Select 메서드를 사용하여 필터링된 DataRow 배열로 생성하는 방법

DataView.RowFilter 속성을 사용하여 필터링하는 방법

2가지 방법이 존재합니다.

 

LINQ를 사용하는 방법도 있지만, 개념 및 사용 방법이 미숙하여 생략하였습니다.

이번 포스팅에서는 위 2가지 방법을 사용하여 DataTable에서 데이터를 검색하는 방법을 정리합니다.

DataTable.Select 메서드를 사용하는 방법

다음 그림과 같은 컬럼과 행을 가진 DataTable 객체 dt가 존재합니다.

 

dt에서 Market 컬럼의 값이 "Lotte"인 데이터만 추출하는 코드입니다.

DataRow[] dataRowArray = dt.Select("Market = 'Lotte'");

실행 결과

Select 메서드를 사용하여 Market 컬럼의 값이 "Lotte"인 DataRow를 배열로 생성했습니다.

 

Select 메서드는 DataRow 배열을 반환하며, 첫 번째 매개변수로 필터링 조건을 작성합니다.

public System.Data.DataRow[] Select (string? filterExpression);

필터링 조건은 SQL의 Where문과 비슷합니다.

 

만약, Martket 컬럼의 값이 "Lotte"이면서 Count 컬럼을 오름차순으로 정렬하고 싶은 경우 두 번째 매개변수에 정렬하고자 하는 컬럼을 작성합니다.

 

두 번째 매개변수는 SQL의 Order by문과 비슷합니다.

DataRow[] dataRowArray = dt.Select("Market = 'Lotte'", "Count ASC");

실행 결과

 

만약, 필터링 결과를 DataTable로 변환해야하는 경우 CopyToDataTable 메서드를 사용합니다.

DataTable resultDt = dt.Select("Market = 'Lotte'", "Count ASC").CopyToDataTable();

 

아래는 전체 코드입니다.

DataTable dt = new DataTable();

// 컬럼 생성
dt.Columns.Add("Market", typeof(string));
dt.Columns.Add("Fruit", typeof(string));
dt.Columns.Add("Price", typeof(int));
dt.Columns.Add("Count", typeof(int));

// 행 추가
dt.Rows.Add("Lotte", "Apple", 2000, 10);
dt.Rows.Add("Lotte", "Banana", 3000, 5);

dt.Rows.Add("Homeplus", "Apple", 1500, 50);
dt.Rows.Add("Homeplus", "Banana", 2500, 10);

dt.Rows.Add("Emart", "Apple", 3000, 25);
dt.Rows.Add("Emart", "Banana", 2000, 5);

dt.Rows.Add("GS", "Apple", 1500, 10);
dt.Rows.Add("GS", "Banana", 3000, 20);

// Unchanged로 변경
dt.AcceptChanges();

// Market이 Lotte이며, Count를 오름차순으로 데이터를 DataRow 배열로 반환합니다.
DataRow[] dataRowArray = dt.Select("Market = 'Lotte'", "Count ASC");

// DataRow 배열을 DataTable로 변환합니다.
DataTable resultDt = dataRowArray.CopyToDataTable();

DataView.RowFilter 속성을 사용하는 방법

다음 그림과 같은 컬럼과 행을 가진 DataTable 객체 dt가 존재합니다.

 

dt에서 Market 컬럼의 값이 "GS"인 데이터만 추출하는 코드입니다.

dt.DefaultView.RowFilter = "Market ='GS'";

실행 결과

dt의 DefaultView로 확인할 수 있습니다.

 

만약, 필터링 결과를 DataTable로 변환해야하는 경우 ToTable 메서드를 사용합니다.

dt.DefaultView.RowFilter = "Market ='GS'";

DataTable resultDt = dt.DefaultView.ToTable();

 

아래는 전체 코드입니다.

DataTable dt = new DataTable();

// 컬럼 생성
dt.Columns.Add("Market", typeof(string));
dt.Columns.Add("Fruit", typeof(string));
dt.Columns.Add("Price", typeof(int));
dt.Columns.Add("Count", typeof(int));

// 행 추가
dt.Rows.Add("Lotte", "Apple", 2000, 10);
dt.Rows.Add("Lotte", "Banana", 3000, 5);

dt.Rows.Add("Homeplus", "Apple", 1500, 50);
dt.Rows.Add("Homeplus", "Banana", 2500, 10);

dt.Rows.Add("Emart", "Apple", 3000, 25);
dt.Rows.Add("Emart", "Banana", 2000, 5);

dt.Rows.Add("GS", "Apple", 1500, 10);
dt.Rows.Add("GS", "Banana", 3000, 20);

// Unchanged로 변경
dt.AcceptChanges();

// Market이 GS인 데이터를 필터합니다.
dt.DefaultView.RowFilter = "Market ='GS'";

// 필터한 DataView를 DataTable로 변환합니다.
DataTable resultDt = dt.DefaultView.ToTable();
반응형

댓글