Ordenar con DataView (LINQ to DataSet)
La capacidad de ordenar datos basándose en criterios específicos y, a continuación, presentarlos a un cliente mediante un control de interfaz de usuario es un aspecto importante del enlace de datos. DataView proporciona varias maneras de ordenar datos y devolver filas de datos ordenados según criterios de ordenación específicos. Además de sus funcionalidades de ordenación basada en cadenas, DataView también permite utilizar expresiones de Language Integrated Query (LINQ) para los criterios de ordenación. Las expresiones LINQ permiten operaciones de ordenación mucho más complejas y eficaces que la ordenación basada en cadenas. En este tema se describen ambos enfoques de ordenación utilizando DataView.
Crear DataView desde una consulta con información de ordenación
Se puede crear un objeto DataView a partir de una consulta de LINQ to DataSet. Si esa consulta contiene una cláusula OrderBy, OrderByDescending, ThenBy o ThenByDescending, las expresiones de estas cláusulas se utilizan como base para la ordenación de los datos en DataView. Por ejemplo, si la consulta contiene las cláusulas Order By…
y Then By…
, el DataView resultante ordenará los datos por ambas columnas especificadas.
La ordenación basada en expresión es más eficaz y compleja que la simple ordenación basada en cadena. Observe que la ordenación basada en cadena y expresión se excluyen mutuamente. Cuando el Sort basado en cadena se establece después de haber creado DataView desde una consulta, el filtro basado en expresión inferido a partir de la consulta se borra y no se puede volver a restablecer.
El índice de DataView se compila cuando se crea DataView y cuando se modifica cualquier información de filtro u ordenación. Obtendrá un rendimiento óptimo si proporciona criterios de ordenación en la consulta de LINQ to DataSet a partir de la cual se crea DataView y no modifica posteriormente la información de ordenación. Para más información, consulte Rendimiento de DataView.
Nota
En la mayor parte de los casos, las expresiones utilizadas en la ordenación no deben tener efectos secundarios y deben ser deterministas. Además, las expresiones no deben tener ninguna lógica que dependa de un número de conjunto de ejecuciones, porque las operaciones de ordenación se pueden ejecutar un número ilimitado de veces.
Ejemplo
El siguiente ejemplo consulta en la tabla SalesOrderHeader y ordena las filas devueltas por fecha de pedido; crea un DataView desde una consulta y enlaza DataView a un 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
Ejemplo
El siguiente ejemplo consulta en la tabla SalesOrderHeader y ordena la fila devuelta por el importe total a pagar; crea un DataView desde una consulta y enlaza DataView a un 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
Ejemplo
El siguiente ejemplo consulta en la tabla SalesOrderDetail y ordena las filas devueltas por cantidad de pedido y, a continuación, por id. del pedido de ventas; crea un DataView desde una consulta y enlaza DataView a un 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
Utilizar la propiedad Sort basada en cadena
La funcionalidad de ordenación basada en cadena de DataView funciona también con LINQ to DataSet. Después de haberse creado DataView desde una consulta de LINQ to DataSet, se puede utilizar la propiedad Sort para establecer la ordenación en DataView.
Las funcionalidades de ordenación basada en cadena y expresión se excluyen mutuamente. Al establecer la propiedad Sort se borrará la ordenación basada en expresión heredada de la consulta a partir de la que se ha creado DataView.
Para más información sobre el filtrado de Sort basado en cadenas, consulte Ordenar y filtrar datos.
Ejemplo
El ejemplo siguiente crea DataView a partir de la tabla Contact y ordena las filas por apellido en orden descendente y luego por nombres en orden ascendente:
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()
Ejemplo
En el siguiente ejemplo se consultan los apellidos que empiezan por la letra "S" en la tabla Contact. Se crea una clase DataView a partir de dicha consulta y se enlaza a un objeto 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"
Borrar la ordenación
Se puede borrar la información de ordenación de DataView después de haberla establecido mediante la propiedad Sort. Hay dos formas de borrar información de ordenación en DataView:
Ejemplo
El siguiente ejemplo crea un DataView desde una consulta y borra la ordenación mediante el establecimiento de la propiedad Sort en una cadena vacía:
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 = ""
Ejemplo
El siguiente ejemplo crea un DataView desde la tabla Contact y establece la propiedad Sort para ordenar por apellidos en orden descendente. A continuación, la información de ordenación se borra estableciendo la propiedad Sort en 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