다음을 통해 공유


DataView 개체 만들기(LINQ to DataSet)

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

DataView를 만든 후에 Windows Forms 응용 프로그램 또는 ASP.NET 응용 프로그램의 UI 컨트롤에 바인딩하거나 필터링 및 정렬 설정을 변경할 수 있습니다.

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

DataView를 사용한 필터링 및 정렬에 대한 자세한 내용은 DataView로 필터링(LINQ to DataSet)DataView로 정렬(LINQ to DataSet)을 참조하십시오.

LINQ to DataSet 쿼리에서 DataView 만들기

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

참고참고

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

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

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

LINQ to DataSet 쿼리에서 DataView를 만드는 경우 Select<TRow, S> 메서드가 쿼리에서 마지막으로 호출되는 메서드여야 합니다. 합계를 기준으로 정렬된 온라인 주문의 DataView를 만드는 다음 예제에서 이를 확인할 수 있습니다.

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
DataTable orders = dataSet.Tables["SalesOrderHeader"];

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

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

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

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 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";

DataTable에서 DataView 만들기

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

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

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

Dim view As DataView = orders.AsDataView()
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()
DataTable orders = dataSet.Tables["SalesOrderDetail"];

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

dataGridView1.AutoResizeColumns();

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

Dim contacts As DataTable = dataSet.Tables("Contact")

Dim view As DataView = contacts.AsDataView()

view.Sort = "LastName desc, FirstName asc"

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

DataView view = contacts.AsDataView();

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

bindingSource1.DataSource = view;
dataGridView1.AutoResizeColumns();

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

참고 항목

개념

데이터 바인딩 및 LINQ to DataSet

DataView로 필터링(LINQ to DataSet)

DataView로 정렬(LINQ to DataSet)