Сортировка с использованием объекта DataView (LINQ to DataSet)
Возможность сортировки данных на основе заданных критериев и их предоставление клиенту с помощью элемента управления в пользовательском интерфейсе - это важный аспект привязки данных. Объект DataView предоставляет несколько способов сортировки и возврата строк данных, упорядоченных по определенным критериям. Помимо возможностей сортировки на основе строк, DataView вы также можете использовать выражения LINQ для критериев сортировки. Выражения LINQ позволяют выполнять гораздо более сложные и мощные операции сортировки, чем сортировка на основе строк. В этом разделе описываются оба подхода к сортировке с помощью объекта DataView.
Создание объекта DataView на основе запроса с данными сортировки
Объект DataView можно создать из запроса LINQ to DataSet. Если этот запрос содержит OrderByOrderByDescendingThenByвыражения , или ThenByDescending предложение выражений в этих предложениях, используются в качестве основы для сортировки данных в объекте .DataView Например, если запрос содержит Order By…
предложения и Then By…
предложения, результат DataView будет упорядочить данные по обоим столбцам.
Сортировка на основе выражений является более сложной и мощной операцией сортировки, чем более простая сортировка на основе строк. Следует иметь в виду, что сортировки на основе строк и выражений являются взаимоисключающими. Если сортировка на основе строк Sort задается после создания объекта DataView на основе запроса, то выводимый из запроса фильтр на основе выражений удаляется и не восстанавливается.
Индекс для DataView формируется как при создании DataView, так и при изменении каких-либо сведений о сортировке или фильтрации. Вы получаете лучшую производительность, указав условия сортировки в запросе LINQ to DataSet, DataView созданном из и не изменяя сведения о сортировке, позже. Дополнительные сведения см. в разделе "Производительность DataView".
Примечание.
В большинстве случаев выражение, используемое для сортировки, не должно иметь побочных эффектов и должно быть детерминированным. Также эти выражения не должны содержать логику, зависящую от заданного количества выполнений, так как операции сортировки могут выполняться любое количество раз.
Пример
В следующем примере выполняется запрос к таблице SalesOrderHeader, а полученные строки упорядочиваются по дате заказа; на основе этого запроса создается объект DataView и привязывается к DataView.
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.
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, а полученные строки упорядочиваются по объему заказа, а затем по идентификатору заказа на продажу; на основе этого запроса создается объект DataView и привязывается к DataView.
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. DataView После создания из запроса LINQ to DataSet можно использовать Sort свойство для задания сортировки по запросу DataView.
Возможности сортировки на основе строк и выражений являются взаимоисключающими. При задании свойства Sort сортировка на основе выражений, унаследованная из запроса, на основе которого был создан объект DataView, удаляется.
Дополнительные сведения о фильтрации на основе Sort строк см. в разделе "Сортировка и фильтрация данных".
Пример
В следующем примере объект DataView создается на основе таблицы Contact, затем выполняется сортировка по фамилиям в возрастающем порядке, а затем по именам в убывающем порядке:
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.
Пример
В следующем примере объект 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 = ""
Пример
В следующем примере объект DataView создается на основе таблицы Contact и в свойстве 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