다음을 통해 공유


DataView로 정렬(LINQ to DataSet)

특정 조건을 기준으로 데이터를 정렬한 다음 UI 컨트롤을 통해 클라이언트에 데이터를 제공하는 기능은 데이터 바인딩의 중요한 기능입니다. DataView에서는 데이터를 정렬하여 특정 정렬 기준에 따라 정렬된 데이터 행을 반환하는 여러 방법을 제공합니다. 문자열 기반 정렬 기능 외에도 DataView를 사용하면 정렬 기준에 LINQ(Language-Integrated Query) 식을 사용할 수 있습니다. LINQ 식을 사용하면 문자열 기반 정렬보다 훨씬 더 복잡하고 강력한 정렬 작업을 수행할 수 있습니다. 이 항목에서는 DataView를 사용하여 정렬하는 두 가지 방법을 모두 설명합니다.

정렬 정보가 있는 쿼리에서 DataView 만들기

DataView 개체는 LINQ to DataSet 쿼리에서 만들 수 있습니다. 해당 쿼리에 OrderBy, OrderByDescending, ThenBy 또는 ThenByDescending 절이 있는 경우 이러한 절의 식은 DataView의 데이터를 정렬하기 위한 기본 요소로 사용됩니다. 예를 들어 쿼리에 Order By…Then By… 절이 있는 경우 결과 DataView는 지정된 두 열을 기준으로 데이터를 정렬합니다.

식 기반 정렬은 간단한 문자열 기반 정렬에 비해 강력하고 복잡한 정렬 기능을 제공합니다. 문자열 기반 정렬 및 식 기반 정렬은 함께 사용할 수 없습니다. 쿼리에서 Sort를 만든 후에 문자열 기반 DataView를 설정하면 쿼리에서 유추된 식 기반 필터가 지워지며, 이 필터는 재설정할 수 없습니다.

DataView의 인덱스는 DataView가 만들어지거나 정렬 또는 필터링 정보가 수정될 때 작성됩니다. 최적의 성능을 얻으려면 DataView가 만들어진 LINQ to DataSet 쿼리에 정렬 기준을 제공한 다음 이후에 정렬 정보를 수정하지 않아야 합니다. 자세한 내용은 성능을 참조하세요.

참고 항목

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

예시

다음 예제에서는 SalesOrderHeader 테이블을 쿼리하여 반환된 행을 주문 날짜를 기준으로 정렬한 다음 해당 쿼리에서 DataView를 만들고 DataViewBindingSource에 바인딩합니다.

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

EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable()
                                         orderby order.Field<DateTime>("OrderDate")
                                         select order;

DataView view = query.AsDataView();

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

Dim query = _
    From order In orders.AsEnumerable() _
    Order By order.Field(Of DateTime)("OrderDate") _
    Select order

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

예시

다음 예제에서는 SalesOrderHeader 테이블을 쿼리하여 반환된 행을 합계 금액을 기준으로 정렬한 다음 해당 쿼리에서 DataView를 만들고 DataViewBindingSource에 바인딩합니다.

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

EnumerableRowCollection<DataRow> query =
    from order in orders.AsEnumerable()
    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() _
    Order By order.Field(Of Decimal)("TotalDue") _
    Select order

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

예시

다음 예제에서는 SalesOrderDetail 테이블을 쿼리하여 반환된 행을 주문 수량과 판매 주문 ID를 기준으로 정렬한 다음 해당 쿼리에서 DataView를 만들고 DataViewBindingSource에 바인딩합니다.

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

EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable()
                                         orderby order.Field<short>("OrderQty"), order.Field<int>("SalesOrderID")
                                         select order;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

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

Dim query = _
    From order In orders.AsEnumerable() _
    Order By order.Field(Of Int16)("OrderQty"), order.Field(Of Integer)("SalesOrderID") _
    Select order

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

문자열 기반 정렬 속성 사용

DataView의 문자열 기반 정렬 기능은 LINQ to DataSet서 계속 사용할 수 있습니다. LINQ to DataSet 쿼리에서 DataView를 만든 후에는 Sort 속성을 사용하여 DataView에 대한 정렬을 설정할 수 있습니다.

문자열 기반 정렬 및 식 기반 정렬 기능은 함께 사용할 수 없습니다. Sort 속성을 설정하면 DataView가 만들어진 쿼리에서 상속된 식 기반 정렬이 지워집니다.

문자열 기반 Sort 필터링에 대한 자세한 내용은 데이터 정렬 및 필터링을 참조하세요.

예시

다음 예제에서는 Contact 테이블에서 DataView를 만든 다음 성을 기준으로 내림차순으로 행을 정렬하고, 이름을 기준으로 오름차순으로 행을 정렬합니다.

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()

예시

다음 예제에서는 Contact 테이블에 대해 "S"로 시작하는 성을 쿼리합니다. 해당 쿼리에서 DataView가 만들어지고 BindingSource 개체에 바인딩됩니다.

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"

정렬 지우기

DataView의 정렬 정보는 설정된 후에 Sort 속성을 사용하여 지울 수 있습니다. 두 가지 방법으로 DataView의 정렬 정보를 지울 수 있습니다.

  • Sort 속성을 null로 설정합니다.

  • Sort 속성을 빈 문자열로 설정합니다.

예시

다음 예제에서는 쿼리에서 DataView를 만든 다음 Sort 속성을 빈 문자열로 설정하여 정렬을 지웁니다.

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

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

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

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

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

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

예시

다음 예제에서는 Contact 테이블에서 DataView를 만든 다음 성을 기준으로 내림차순으로 정렬하도록 Sort 속성을 설정합니다. 그런 다음 Sort 속성을 null로 설정하여 정렬 정보를 지웁니다.

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

DataView view = contacts.AsDataView();

view.Sort = "LastName desc";

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

// Clear the sort.
view.Sort = null;
Dim contacts As DataTable = dataSet.Tables("Contact")

Dim view As DataView = contacts.AsDataView()
view.Sort = "LastName desc"

bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

'Clear the sort.
view.Sort = Nothing

참고 항목