Поделиться через


Сортировка с помощью DataView (LINQ to DataSet)

Возможность сортировки данных на основе определенных критериев, а затем представления данных клиенту с помощью элемента управления пользовательским интерфейсом является важным аспектом привязки данных. DataView предоставляет несколько способов сортировки данных и возврата строк данных, упорядоченных определенными критериями упорядочивания. Помимо возможностей сортировки на основе строк, DataView также позволяет вам использовать выражения Language-Integrated запроса (LINQ) в качестве критериев сортировки. Выражения LINQ позволяют выполнять гораздо более сложные и мощные операции сортировки, чем сортировка на основе строк. В этом разделе описаны оба подхода к сортировке с помощью DataView.

Создание DataView из запроса с помощью сведений о сортировке

Объект DataView можно создать из запроса LINQ to DataSet. Если этот запрос содержит условие OrderBy, OrderByDescending, ThenBy или ThenByDescending, то выражения в этих условиях используются в качестве основы для сортировки данных в DataView. Например, если запрос содержит предложения Order By… и Then By…, результат DataView упорядочит данные по обоим указанным столбцам.

Сортировка на основе выражений обеспечивает более мощную и сложную сортировку, чем более простая сортировка на основе строк. Обратите внимание, что сортировка на основе строк и выражений являются взаимоисключающими. Если строка Sort задана после создания DataView из запроса, фильтр на основе выражений, полученный из запроса, очищается и не может быть сброшен.

Индекс для объекта DataView создается как при его DataView создании, так и при изменении любой информации о сортировке или фильтрации. Вы получите лучшую производительность, если укажете условия сортировки в запросе LINQ to DataSet, на основе которого создается DataView, и не будете изменять сведения о сортировке впоследствии. Дополнительные сведения см. в разделе "Производительность DataView".

Замечание

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

Пример

В следующем примере выполняется запрос к таблице SalesOrderHeader и сортирует возвращенные строки по дате заказа; создает DataView из этого запроса и привязывает DataView к BindingSource.

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 привязывается к BindingSource.

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 и сортирует возвращенные строки по количеству заказов, а затем по ID заказа; создает из этого запроса DataView и привязывает DataView к BindingSource.

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

Использование свойства сортировки String-Based

Функции сортировки 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()

Пример

В следующем примере таблица контактов запрашивает фамилии, начинающиеся с буквы "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

См. также