DataView 개체 만들기(LINQ to DataSet)

DataView 컨텍스트에서 두 가지 방법으로 LINQ to DataSet를 만들 수 있습니다. DataTable을 통해 LINQ to DataSet 쿼리에서 DataView를 만들거나 형식화되었거나 형식화되지 않은 DataTable을 사용하여 만들 수 있습니다. 두 경우 모두 AsDataView 확장명 메서드 중 하나를 사용하여 DataView를 만들게 되며, LINQ to DataSet 컨텍스트에서 DataView를 직접 만들 수는 없습니다.

DataView를 만든 후에 Windows Forms 애플리케이션 또는 ASP.NET 애플리케이션의 UI 컨트롤에 바인딩하거나 필터링 및 정렬 설정을 변경할 수 있습니다.

DataView에서 만든 인덱스는 필터링 및 정렬과 같이 인덱스를 사용할 수 있는 작업의 성능을 크게 높여 줍니다. DataView의 인덱스는 DataView가 만들어지거나 정렬 또는 필터링 정보가 수정될 때 작성됩니다. DataView를 만든 다음 정렬 또는 필터링 정보를 설정하면 DataView가 만들어질 때와 정렬 또는 필터 속성이 수정될 때 각각 한 번씩 인덱스가 작성되므로 적어도 두 개의 인덱스가 작성됩니다.

DataView를 사용한 필터링 및 정렬에 대한 자세한 내용은 DataView를 사용한 필터링DataView를 사용한 정렬을 참조하세요.

LINQ to DataSet 쿼리에서 DataView 만들기

DataView 개체는 LINQ to DataSet 쿼리 결과에서 만들어집니다. 여기서 결과는 DataRow 개체의 프로젝션입니다. 새로 만들어진 DataView는 자신을 만든 쿼리의 필터링 및 정렬 정보를 상속합니다.

참고 항목

대부분의 경우 필터링 및 정렬에 사용되는 식은 파생 효과가 없어야 하고 명확해야 합니다. 또한 정렬 및 필터링 작업이 여러 번 실행될 수 있으므로 이러한 식에는 실행 집합 번호에 따라 달라지는 논리가 없어야 합니다.

익명 형식을 반환하는 쿼리 또는 조인 연산을 수행하는 쿼리에서는 DataView를 만들 수 없습니다.

DataView를 만드는 데 사용하는 쿼리에서는 다음과 같은 쿼리 연산자만 지원됩니다.

LINQ to DataSet 쿼리에서 DataView를 만들 때 Select 메서드는 쿼리에서 호출되는 최종 메서드여야 합니다. 다음 예제에서는 합계를 기준으로 정렬된 온라인 주문의 DataView를 만듭니다.

DataTable orders = _dataSet.Tables["SalesOrderHeader"];

EnumerableRowCollection<DataRow> query =
    from order in orders.AsEnumerable()
    where order.Field<bool>("OnlineOrderFlag")
    orderby order.Field<decimal>("TotalDue")
    select order;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;
Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")

Dim query = _
    From order In orders.AsEnumerable() _
    Where order.Field(Of Boolean)("OnlineOrderFlag") = True _
    Order By order.Field(Of Decimal)("TotalDue") _
    Select order

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view

또한 문자열 기반 RowFilterSort 속성을 사용하여 쿼리에서 만들어진 DataView를 필터링 및 정렬할 수 있습니다. 이렇게 하면 쿼리에서 상속된 정렬 및 필터링 정보가 지워집니다. 다음 예제에서는 ‘S’로 시작하는 성을 기준으로 필터링하는 LINQ to DataSet 쿼리에서 DataView를 만듭니다. 성을 기준으로 오름차순으로 정렬한 다음 이름을 기준으로 내림차순으로 정렬하도록 문자열 기반 Sort 속성을 설정합니다.

DataTable contacts = _dataSet.Tables["Contact"];

EnumerableRowCollection<DataRow> query = from contact in contacts.AsEnumerable()
                                         where contact.Field<string>("LastName").StartsWith("S")
                                         select contact;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

view.Sort = "LastName desc, FirstName asc";
Dim contacts As DataTable = dataSet.Tables("Contact")

Dim query = _
    From contact In contacts.AsEnumerable() _
    Where contact.Field(Of String)("LastName").StartsWith("S") _
    Select contact

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
view.Sort = "LastName desc, FirstName asc"

DataTable에서 DataView 만들기

LINQ to DataSet 쿼리에서 만드는 것 외에도 DataView 개체는 DataTable에서 AsDataView 메서드를 사용하여 만들 수도 있습니다.

다음 예제에서는 SalesOrderDetail 테이블에서 DataView를 만든 다음 BindingSource 개체의 데이터 소스로 설정합니다. 이 개체는 DataGridView 컨트롤에 대한 프록시 역할을 합니다.

DataTable orders = _dataSet.Tables["SalesOrderDetail"];

DataView view = orders.AsDataView();
bindingSource1.DataSource = view;

dataGridView1.AutoResizeColumns();
Dim orders As DataTable = dataSet.Tables("SalesOrderDetail")

Dim view As DataView = orders.AsDataView()
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

DataTable에서 만들어진 DataView에 필터링 및 정렬을 설정할 수 있습니다. 다음 예제에서는 Contact 테이블에서 DataView를 만든 다음 성을 기준으로 오름차순으로 정렬하고, 이름을 기준으로 내림차순으로 정렬하도록 Sort 속성을 설정합니다.

DataTable contacts = _dataSet.Tables["Contact"];

DataView view = contacts.AsDataView();

view.Sort = "LastName desc, FirstName asc";

bindingSource1.DataSource = view;
dataGridView1.AutoResizeColumns();
Dim contacts As DataTable = dataSet.Tables("Contact")

Dim view As DataView = contacts.AsDataView()

view.Sort = "LastName desc, FirstName asc"

bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

그러나 쿼리에서 RowFilter를 만든 후에 Sort 또는 DataView 속성을 설정하면 필터링 및 정렬 작업을 지원하기 위해 DataView에서 인덱스가 생성되므로 성능이 저하됩니다. RowFilter 또는 Sort 속성을 설정하면 데이터에 대한 인덱스가 다시 작성되므로 애플리케이션에 오버헤드가 발생하여 성능이 저하됩니다. 가능하면 DataView를 처음 만들 때 필터링 및 정렬 정보를 지정하고 이후에는 수정하지 않는 것이 좋습니다.

참고 항목