LINQ to DataSet 컨텍스트에서 만드는 DataView 방법에는 두 가지가 있습니다. LINQ to DataSet 쿼리를 통해 DataView에서 DataTable를 만들거나 형식화된 또는 형식화되지 않은 DataTable에서 만들 수 있습니다. 두 경우 모두 DataView 확장 메서드 중 하나를 사용하여 AsDataView를 생성합니다. DataView는 LINQ to DataSet 컨텍스트에서 직접 생성할 수 없습니다.
DataView 만든 후에는 Windows Forms 애플리케이션 또는 ASP.NET 애플리케이션의 UI 컨트롤에 바인딩하거나 필터링 및 정렬 설정을 변경할 수 있습니다.
DataView 는 인덱스를 생성하여 필터링 및 정렬과 같이 인덱스를 사용할 수 있는 작업의 성능을 크게 향상합니다. DataView가 생성될 때와 정렬 또는 필터링 정보가 수정될 때 인덱스가 모두 빌드됩니다. DataView을 생성한 다음 나중에 정렬 또는 필터 정보를 설정하면 인덱스가 최소 두 번 빌드됩니다: 한 번은 DataView이 생성될 때, 그리고 정렬 또는 필터 속성이 수정될 때입니다.
필터링 및 정렬 DataView에 대한 자세한 내용은 DataView를 사용한 필터링 및 DataView를 사용한 정렬을 참조하세요.
LINQ to DataSet 쿼리를 사용하여 DataView 생성하기
DataView LINQ to DataSet 쿼리의 결과에서 개체를 만들 수 있습니다. 여기서 결과는 개체의 DataRow 프로젝션입니다. 새로 만든 DataView 쿼리에서 필터링 및 정렬 정보를 상속합니다.
비고
대부분의 경우 필터링 및 정렬에 사용되는 식에는 부작용이 없어야 하며 결정적이어야 합니다. 또한 정렬 및 필터링 작업이 여러 번 실행될 수 있으므로 식에는 설정된 실행 수에 따라 달라지는 논리가 포함되어서는 안 됩니다.
조인 작업을 수행하는 익명 형식 또는 쿼리를 반환하는 쿼리로부터 DataView을 생성하는 것은 지원되지 않습니다.
만드는 DataView데 사용되는 쿼리에서는 다음 쿼리 연산자만 지원됩니다.
DataView는 LINQ to DataSet 쿼리에서 생성될 때, 쿼리에서 호출되는 최종 메서드는 반드시 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
문자열 기반 RowFilter 및 Sort 속성을 사용하여 쿼리에서 만들어진 DataView를 필터링하고 정렬할 수도 있습니다. 그러면 쿼리에서 상속된 정렬 및 필터링 정보가 지워질 수 있습니다. 다음 예제에서는 LINQ to DataSet 쿼리를 사용하여 'S'로 시작하는 성을 필터링하고 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 개체를 만들 수 있습니다.
다음 예제에서는 DataView SalesOrderDetail 테이블에서 만들어 개체의 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()
필터링 및 정렬은 DataView에서 생성된 후 DataTable에 설정할 수 있습니다. 다음 예제에서는 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 때 필터링 및 정렬 정보를 지정하고 나중에 수정하지 않는 것이 좋습니다.