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

基于特定条件对数据进行排序,然后通过 UI 控件向客户端表示该数据的能力是数据绑定的一个重要特征。 DataView 提供多种方式对数据进行排序并返回按指定排序条件排序的数据行。 除了基于字符串的排序功能外,DataView 还允许你使用语言集成查询 (LINQ) 表达式作为排序条件。 LINQ 表达式允许实现比基于字符串的排序更复杂、更强大的排序操作。 本主题介绍这两种使用 DataView 的排序方法。

通过具有排序信息的查询创建 DataView

可以通过 LINQ to DataSet 查询创建 DataView 对象。 如果查询包含 OrderByOrderByDescendingThenByThenByDescending 子句,则这些子句中的表达式将用作对 DataView 中的数据进行排序的基础。 例如,如果查询包含 Order By…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

使用基于字符串的排序属性

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

请参阅