Создание объекта DataView (LINQ to DataSet)Creating a DataView Object (LINQ to DataSet)

Существует два способа создания DataView в LINQ to DataSet контекста.There are two ways to create a DataView in the LINQ to DataSet context. Можно создать DataView из LINQ для запросов набора данных к DataTable, или ее можно создать из типизированного или нетипизированного DataTable.You can create a DataView from a LINQ to DataSet query over a DataTable, or you can create it from a typed or un-typed DataTable. В обоих случаях вы создадите DataView с помощью одного из AsDataView методы расширения; DataView не напрямую создать в LINQ to DataSet контекста.In both cases, you create the DataView by using one of the AsDataView extension methods; DataView is not directly constructible in the LINQ to DataSet context.

После создания объекта DataView его можно привязать к элементу управления в пользовательском интерфейсе приложения Windows Forms или ASP.NET либо изменить параметры фильтрации и сортировки.After the DataView has been created, you can bind it to a UI control in a Windows forms application or an ASP.NET application, or change the filtering and sorting settings.

Объект DataView создает индекс, значительно повышающий производительность операций, использующих этот индекс, таких как фильтрация и сортировка.DataView constructs an index, which significantly increases the performance of operations that can use the index, such as filtering and sorting. Индекс для DataView формируется как при создании DataView, так и при изменении каких-либо сведений о сортировке или фильтрации.The index for a DataView is built both when the DataView is created and when any of the sorting or filtering information is modified. Создание DataView и последующее задание сведений о сортировке или фильтрации приводит как минимум к двукратному построению индекса - при создании DataView и при изменении каких-либо свойств сортировки или фильтрации.Creating a DataView and then setting the sorting or filtering information later causes the index to be built at least twice: once when the DataView is created, and again when any of the sort or filter properties are modified.

Дополнительные сведения о фильтрации и сортировке с DataView, см. в разделе фильтрации с использованием объекта DataView и сортировка с использованием объекта DataView.For more information about filtering and sorting with DataView, see Filtering with DataView and Sorting with DataView.

Создание объекта DataView на основе запроса LINQ to DataSetCreating DataView from a LINQ to DataSet Query

Объект DataView объект может быть создан в результате выполнения LINQ запрос к набору данных, где результаты являются проекцией DataRow объектов.A DataView object can be created from the results of a LINQ to DataSet query, where the results are a projection of DataRow objects. Созданный объект DataView наследует сведения о фильтрации и сортировке из запроса, на основе которого он был создан.The newly created DataView inherits the filtering and sorting information from the query it is created from.

Примечание

 В большинстве случаев выражение, используемое для фильтрации и сортировки, не должно иметь побочных эффектов и должно быть детерминированным.In most cases, the expressions used for filtering and sorting should not have side effects and must be deterministic. Также эти выражения не должны содержать логику, зависящую от заданного количества выполнений, так как операции фильтрации и сортировки могут выполняться любое количество раз.Also, the expressions should not contain any logic that depend on a set number of executions, as the sorting and filtering operations may be executed any number of times.

Не поддерживается создание объектов DataView на основе запросов, возвращающих анонимные типы, или запросов, содержащих операции соединения.Creating a DataView from a query that returns anonymous types or queries that perform join operations is not supported.

В запросах, на основе которых создаются объекты DataView, поддерживаются только следующие операторы запросов:Only the following query operators are supported in a query used to create DataView:

Обратите внимание, что при DataView создается на основе LINQ для запроса к набору данных Select метод должен быть завершающим методом, вызываемым в запросе.Note that when a DataView is created from a LINQ to DataSet query the Select method must be the final method called in the query. Это показано в следующем примере, который создает DataView online заказов, отсортированных по сумме заказа:This is shown in the following example, which creates a DataView of online orders sorted by total due:

DataTable orders = dataSet.Tables["SalesOrderHeader"];

EnumerableRowCollection<DataRow> query =
    from order in orders.AsEnumerable()
    where order.Field<bool>("OnlineOrderFlag") == true
    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 после его создания на основе запроса.You can also use the string-based RowFilter and Sort properties to filter and sort a DataView after it has been created from a query. Обратите внимание, что при этом сведения о сортировке и фильтрации, унаследованные из запроса, будут удалены.Note that this will clear the sorting and filtering information inherited from the query. В следующем примере создается DataView с LINQ для запроса набора данных, выполняющего фильтрацию по фамилии, начинающиеся с помощью элемента ".The following example creates a DataView from a LINQ to DataSet query that filters by last names that start with 'S'. Строковое свойство Sort задает сортировку по фамилиям в возрастающем порядке, а затем по именам в убывающем порядке:The string-based Sort property is set to sort on last names in ascending order and then first names in descending order:

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 на основе DataTableCreating a DataView from a DataTable

В дополнение к, созданные из LINQ для запроса набора данных, DataView объект может быть создан из DataTable с помощью AsDataView метод.In addition to being created from a LINQ to DataSet query, a DataView object can be created from a DataTable by using the AsDataView method.

В следующем примере объект DataView создается на основе таблицы SalesOrderDetail и становится источником данных для объекта BindingSource.The following example creates a DataView from the SalesOrderDetail table and sets it as the data source of a BindingSource object. Этот объект выступает в роли посредника для элемента управления DataGridView.This object acts as a proxy for a DataGridView control.

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.Filtering and sorting can be set on the DataView after it has been created from a DataTable. В следующем примере объект DataView создается на основе таблицы Contact, и в свойстве Sort задается сортировка по фамилиям в возрастающем порядке, а затем по именам в убывающем порядке:The following example creates a DataView from the Contact table and sets the Sort property to sort on last names in ascending order and then first names in descending order:

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 строит индекс для поддержки операций фильтрации и сортировки.However, there is a performance loss that comes with setting the RowFilter or Sort property after the DataView has been created from a query, because DataView constructs an index to support filtering and sorting operations. При установке свойств RowFilter или Sort перестраивается индекс данных, что добавляет нагрузку на приложение и снижает производительность.Setting the RowFilter or Sort property rebuilds the index for the data, adding overhead to your application and decreasing performance. Если возможно, лучше указать сведения о фильтрации и сортировке при создании объекта DataView и избежать необходимости изменять его позднее.When possible, it is better to specify the filtering and sorting information when you first create the DataView and avoid modifying it afterwards.

См. такжеSee also