Создание объекта 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 to DataSet

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

Примечание.

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

Не поддерживается создание объектов DataView на основе запросов, возвращающих анонимные типы, или запросов, содержащих операции соединения.

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

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

См. также