使用 DataView 進行排序 (LINQ to DataSet)
根據特定準則來排序資料,然後透過 UI 控制項呈現資料給用戶端的功能是資料繫結的重要層面。 DataView 提供了許多方式來排序資料並傳回依據特定排序準則所排序的資料列。 除了字串型排序功能之外,DataView 也可讓您針對排序準則使用 Language-Integrated Query (LINQ) 運算式。 LINQ 運算式可執行比字串型排序更複雜且更強大的排序作業。 本主題將說明兩種使用 DataView 進行排序的方法。
從含有排序資訊的查詢中建立 DataView
您可以從 LINQ to DataSet 查詢建立 DataView 物件。 如果該查詢包含 OrderBy、OrderByDescending、ThenBy 或 ThenByDescending 子句,這些子句中的運算式就會當作在 DataView 中排序資料的基礎使用。 例如,如果此查詢包含 Order By…
和 Then By…
子句,則產生的 DataView 就會依據這兩個指定的資料行來排序資料。
以運算式為基礎的排序會比較簡單的以字串為基礎的排序提供功能更強大且更複雜的排序。 請注意,以字串為基礎的排序和以運算式為基礎的排序會互斥 (Mutually Exclusive)。 如果您從查詢中建立 Sort 之後才設定以字串為基礎的 DataView,就會清除從查詢中推斷的以運算式為基礎的篩選,而且無法加以重設。
在您建立 DataView 以及修改任何排序或篩選資訊時,系統就會建立 DataView 的索引。 您可以在從中建立 DataView 的 LINQ to DataSet 查詢中提供排序準則,而且之後不修改排序資訊,藉此取得最佳效能。 如需詳細資訊,請參閱 DataView 效能。
注意
在大部分清況中,用於排序的運算式不應該具有副作用 (Side Effect) 而且必須具決定性。 此外,這些運算式不應該包含取決於固定執行次數的任何邏輯,因為排序作業可能會執行任何次數。
範例
下列範例會查詢 SalesOrderHeader 資料表並依據訂單日期排序傳回的資料列、從該查詢中建立 DataView,然後將 DataView 繫結至 BindingSource。
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,然後將 DataView 繫結至 BindingSource。
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 資料表並先後依據訂單數量和銷售訂單識別碼排序傳回的資料列、從該查詢中建立 DataView,然後將 DataView 繫結至 BindingSource。
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
使用以字串為基礎的 Sort 屬性
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 中的排序資訊:
範例
下列範例會從查詢中建立 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