Сортировка с использованием объекта 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.

  • Установите свойство Sort в значение null.

  • Установите свойство Sort равным пустой строке.

Пример

В следующем примере объект 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

См. также