创建 DataView 对象(LINQ to DataSet)

可通过两种方法在 LINQ to DataSet 上下文中创建一个 DataView 。 你可以在 DataView 上从 LINQ to DataSet 查询创建 DataTable,也可以从类型化或非类型化 DataTable 创建它。 在这两种情况下,均使用某个DataView扩展方法创建AsDataView;DataView在 LINQ to DataSet 上下文中不可直接构造。

创建后 DataView ,你可以将其绑定到 Windows 窗体应用程序或 ASP.NET 应用程序中的 UI 控件,或更改筛选和排序设置。

DataView 构造索引,这显著提高了可以利用索引的操作的性能,例如筛选和排序。 创建 DataView 及修改任何排序或筛选信息时,均会生成 DataView 的索引。 创建一个DataView,然后再设置排序或筛选信息,将导致索引至少被构建两次:第一次是在DataView创建时,第二次是在任何排序或筛选属性被修改时。

有关筛选和排序 DataView的详细信息,请参阅 使用 DataView 进行筛选和 DataView 排序

通过 LINQ to DataSet 查询创建 DataView

可以通过 LINQ to DataSet 查询的结果创建一个 DataView 对象,其中结果是 DataRow 对象的投影。 新创建的 DataView 将从其创建的查询继承筛选和排序信息。

注释

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

不支持从返回匿名类型或执行联接操作的查询中创建DataView

在用于创建的 DataView查询中仅支持以下查询运算符:

请注意,从 LINQ to DataSet 查询创建方法 DataView 时, 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 后,使用基于字符串的 SortDataView 属性对其进行筛选和排序。 请注意,这将清除从查询继承的排序和筛选信息。 以下示例从 LINQ to DataSet 查询创建一个 DataView ,该查询按以“S”开头的姓氏筛选。 基于 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"

从数据表创建 DataView

除了通过 LINQ to DataSet 查询创建DataView对象之外,还可以使用DataTable方法从AsDataView创建DataView对象。

以下示例从 SalesOrderDetail 表创建一个 DataView ,并将其设置为对象的数据源 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之后,设置SortDataView 属性时会出现性能损失,因为DataView会构造索引以支持筛选和排序操作。 RowFilter设置或Sort属性会重新生成数据的索引,从而增加应用程序开销并降低性能。 如果可能,最好在首次创建 DataView 筛选和排序信息时指定筛选和排序信息,避免以后对其进行修改。

另请参阅