Compartir a través de


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:

  • Establezca la propiedad Sort en null.

  • Establecer la propiedad Sort en una cadena vacía.

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

Consulte también