使用 DataView 进行排序 (LINQ to DataSet)

能够基于特定条件对数据进行排序,然后通过 UI 控件将数据呈现给客户端,这是数据绑定的一个重要方面。 DataView 提供了多种方式来对数据进行排序,并返回按特定排序条件排序的数据行。 除了基于字符串的排序功能之外, DataView 还可以对排序条件使用 Language-Integrated 查询(LINQ)表达式。 LINQ 表达式允许进行比基于字符串的排序更复杂、更强大的排序操作。 本主题介绍使用 DataView这两种方法进行排序。

从包含排序信息的查询中创建 DataView

可以从 LINQ to DataSet 查询创建一个DataView对象。 如果该查询包含一个OrderByOrderByDescendingThenByThenByDescending子句,那么这些子句中的表达式用作DataView中数据排序的基础。 例如,如果查询包含 Order By…and Then By… 子句,则生成的 DataView 结果将按指定的两列对数据进行排序。

基于表达式的排序比基于字符串的排序更强大、更复杂。 请注意,基于字符串的排序和基于表达式的排序互斥。 如果在从查询创建Sort后设置了基于字符串的DataView,那么从查询推断出的基于表达式的筛选器将被清除,并且无法重置。

创建 DataView 及修改任何排序或筛选信息时,均会生成 DataView 的索引。 通过在用于创建 DataView 的 LINQ to DataSet 查询中提供排序条件且在以后不修改排序信息来获得最佳性能。 有关详细信息,请参阅 DataView 性能

注释

在大多数情况下,用于排序的表达式不应具有副作用,并且必须具有确定性。 此外,表达式不应包含依赖于一组执行次数的任何逻辑,因为排序作可能会执行任意次数。

示例:

以下示例查询 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 表,并按订单数量和销售订单 ID 对返回的行进行排序;从该查询创建一个 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

使用 String-Based 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”开头的姓氏。 A 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

另请参阅