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

Существует два способа создания DataView в контексте LINQ to DataSet. Вы можете создать DataView из запроса LINQ to DataSet по запросу DataTable или создать его из типизированного или нетипизированного DataTable. В обоих случаях вы создаете DataView, используя один из AsDataView методов расширения; DataView не может быть сконструирован напрямую в контексте LINQ to DataSet.

DataView После создания его можно привязать к элементу управления пользовательского интерфейса в приложении Windows Forms или приложении ASP.NET или изменить параметры фильтрации и сортировки.

DataView создает индекс, который значительно повышает производительность операций, которые могут использовать индекс, например фильтрацию и сортировку. Индекс для объекта DataView создается как при его DataView создании, так и при изменении любой информации о сортировке или фильтрации. DataView Создание и последующая настройка сведений о сортировке или фильтрации приводит к тому, что индекс создается по крайней мере дважды: один раз при создании и вновь при изменении DataView любого из свойств сортировки или фильтрации.

Дополнительные сведения о фильтрации и сортировке с помощью DataView см. в разделах "Фильтрация с помощью DataView" и "Сортировка с помощью DataView".

Создание DataView из запроса LINQ к DataSet-данным

DataView Объект можно создать из результатов запроса LINQ to DataSet, где результаты являются проекцией DataRow объектов. Только что созданный DataView наследует данные фильтрации и сортировки из созданного запроса.

Замечание

В большинстве случаев выражения, используемые для фильтрации и сортировки, не должны иметь побочных эффектов и должны быть детерминированными. Кроме того, выражения не должны содержать логику, зависящую от заданного количества выполнений, так как операции сортировки и фильтрации могут выполняться в любое количество раз.

Создание DataView от запроса, возвращающего анонимные типы или выполняющего операции соединения, не поддерживается.

В запросе поддерживаются только следующие операторы запросов, используемые для создания DataView:

Обратите внимание, что при создании DataView из запроса LINQ to DataSet метод 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 и Sort для фильтрации и сортировки DataView после его создания из запроса. Обратите внимание, что это очищает данные сортировки и фильтрации, унаследованные от запроса. В следующем примере создается DataView, который выполняет запрос LINQ to DataSet для фильтрации фамилий, начинающихся с "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 из DataTable

Помимо создания из запроса LINQ to DataSet, объект DataView можно создать из DataTable с помощью метода AsDataView.

В следующем примере создается объект DataView из таблицы SalesOrderDetail и устанавливается как источник данных для объекта 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, можно задать фильтрацию и сортировку. Следующий пример создает DataView из таблицы Contact и устанавливает свойство 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 или Sort после того как DataView создан из запроса, так как DataView конструирует индекс для поддержки операций фильтрации и сортировки. Установка свойства RowFilter или Sort перестраивает индекс для данных, добавляя вычислительные затраты на приложение и снижая производительность. По возможности лучше указать сведения о фильтрации и сортировке при первом создании DataView и не изменять их после этого.

См. также