Ordenar filas usando QueryExpression
Para especificar el orden de clasificación de las filas de las tablas, utilice las propiedades QueryExpression.Orders o LinkEntity.Orders.
Nota
La propiedad Orders
es de solo lectura. Puede configurar instancias de OrderExpression en esta colección usando la inicialización de objetos o usando el método QueryExpression.AddOrder.
LinkEntity
no tiene un método AddOrder
. Puede usar métodos System.Collections.ObjectModel.Collection<T> las herencias de propiedades de Orders
.
El criterio de ordenación predeterminado es OrderType.Ascending
.
La siguiente consulta devuelve los registro cuenta en orden ascendente por valores de createdon
, name
y accountnumber
.
var query = new QueryExpression(entityName: "account") {
ColumnSet = new ColumnSet("name", "accountnumber", "createdon"),
Orders = {
{
new OrderExpression(
attributeName: "createdon",
orderType: OrderType.Ascending)
},
{
new OrderExpression(
attributeName: "name",
orderType: OrderType.Ascending)
},
{
new OrderExpression(
attributeName: "accountnumber",
orderType: OrderType.Ascending)
},
}
};
Esta misma consulta se puede componer usando el método QueryExpression.AddOrder:
var query = new QueryExpression(entityName: "account") {
ColumnSet = new ColumnSet("name", "accountnumber", "createdon")
};
query.AddOrder(attributeName: "createdon", orderType: OrderType.Ascending);
query.AddOrder(attributeName: "name", orderType: OrderType.Ascending);
query.AddOrder(attributeName: "accountnumber", orderType: OrderType.Ascending);
El orden de los elementos determina cómo se aplica el orden. Para que el pedido se aplique usando accountnumber
, agregue ese pedido primero:
query.AddOrder(attributeName: "accountnumber", orderType: OrderType.Ascending);
query.AddOrder(attributeName: "createdon", orderType: OrderType.Ascending);
query.AddOrder(attributeName: "name", orderType: OrderType.Ascending);
Orden descendente
Si desea utilizar orden descendente, utilice OrderType.Descending
. El siguiente ejemplo devuelve registros de cuenta con los registros creados más recientemente en la parte superior.
var query = new QueryExpression(entityName: "account") {
ColumnSet = new ColumnSet("name", "createdon")
};
query.AddOrder(attributeName: "createdon", orderType: OrderType.Descending);
Procesar primero los pedidos de LinkEntity
Dataverse siempre ordena las columnas especificadas por LinkEntity.Orders después de QueryExpression.Orders.
El siguiente ejemplo muestra un patrón de ordenamiento convencional para las columnas LinkEntity
y QueryExpression
.
var query = new QueryExpression(entityName: "account")
{
ColumnSet = new ColumnSet("name", "accountnumber", "createdon"),
LinkEntities = {
new LinkEntity(
linkFromEntityName:"account",
linkToEntityName:"account",
linkFromAttributeName: "parentaccountid",
linkToAttributeName:"accountid",
joinOperator: JoinOperator.Inner){
EntityAlias = "parentaccount",
Columns = new ColumnSet("name"),
Orders = {
{
new OrderExpression(
attributeName:"name",
orderType: OrderType.Ascending)
}
}
}
},
Orders = {
{
new OrderExpression(
attributeName:"name",
orderType: OrderType.Ascending)
}
}
};
En este caso, los resultados se ordenan utilizando los siguientes atributos:
- Primero =>
account.name
- Último =>
parentaccountname.name
Para garantizar que el orden LinkEntity
se aplique primero, mueva el OrderExpression
del LinkEntity.Orders
al QueryExpression.Orders
sobre el otro OrderExpression
y utilice OrderExpression.EntityName para hacer referencia al valor LinkEntity.EntityAlias.
var query = new QueryExpression(entityName: "account")
{
ColumnSet = new ColumnSet("name", "accountnumber", "createdon"),
LinkEntities = {
new LinkEntity(
linkFromEntityName:"account",
linkToEntityName:"account",
linkFromAttributeName: "parentaccountid",
linkToAttributeName:"accountid",
joinOperator: JoinOperator.Inner){
EntityAlias = "parentaccount",
Columns = new ColumnSet("name")
}
},
Orders = {
{
new OrderExpression(
attributeName:"name",
orderType: OrderType.Ascending){
// LinkEntity.EntityAlias value
EntityName = "parentaccount"
}
},
{
new OrderExpression(
// QueryExpression Columns name
attributeName:"name",
orderType: OrderType.Ascending)
}
}
};
Ahora los resultados están ordenados mediante los siguientes atributos:
- Primero =>
parentaccount.name
- Último =>
account.name
Ordenar columnas de búsqueda y opción
Los datos contenidos en la mayoría de los tipos de columnas son relativamente simples y puede realizar operaciones de ordenación que tengan sentido. Las columnas de búsqueda y opción son más complejas porque los datos almacenados en la base de datos no son significativos fuera de contexto.
Columnas de búsqueda
Cuando realiza un pedido utilizando columnas de búsqueda, los resultados se ordenan utilizando el campo de nombre principal de la tabla relacionada. La base de datos almacena un valor de GUID. El valor con formato devuelto es el campo del nombre principal correspondiente.
Columnas de opción
Los valores de las columnas de elección también se ordenan utilizando el valor formateado en lugar de los valores almacenados en la base de datos. Los datos de estas columnas se almacenan como números enteros. El valor con formato es una etiqueta traducida según el idioma del usuario.
Nota
Dado que la clasificación de opciones se basa en la etiqueta localizada del idioma de los usuarios, esto dará lugar a un orden diferente para los resultados establecidos si el idioma del usuario es diferente.
Ordenación y paginación
La forma en que se ordena una página marca una gran diferencia al paginar datos. Si la información sobre cómo se ordenan los resultados es ambigua, Dataverse no puede devolver datos paginados de manera consistente o eficiente.
Especifique un pedido para su consulta. Con FetchXml, si no agrega ningún elemento de pedido a su consulta, Dataverse agrega un pedido basado en la clave principal de la tabla. Sin embargo, QueryExpression no lo hace, y cuando su consulta especifica resultados distinct
, no se devuelven valores de clave principal, por lo que Dataverse no puede agregar este orden predeterminado. Debe especificar un orden de paginación. Sin ningún orden especificado, los resultados de la consulta de distinct
pueden devolverse en orden aleatorio. OData no proporciona ninguna opción para devolver resultados distintos, pero aún así debes aplicar un orden al recuperar resultados paginados.
La paginación es dinámica. Cada solicitud se evalúa de forma independiente a medida que se recibe. Una cookie de paginación indica la página anterior de Dataverse. Con estos datos de cookie de paginación, Dataverse puede comenzar con el siguiente registro después del último en la página anterior.
La paginación funciona mejor en el futuro. Si regresa y recupera una página que recuperó anteriormente, los resultados pueden ser diferentes porque se podrían agregar, eliminar o modificar registros desde la última vez que recuperó la página. En otras palabras, si el tamaño de su página es 50 y regresa, obtendrá 50 registros, pero es posible que no sean los mismos 50 registros. Si continúa avanzando por las páginas de un conjunto de datos, puede esperar que todos los registros se devuelvan en una secuencia coherente.
La ordenación determinista es importante
Orden determinista significa que hay una manera de calcular un orden de manera consistente. Con un conjunto de registros determinado, los registros siempre se devuelven en el mismo orden. Si necesita pedidos y paginación consistentes, debe incluir algunos valores únicos o una combinación de valores de columna y especificar un orden para que se evalúen.
Ejemplo no determinista
Veamos un ejemplo que es nodeterminista. Este conjunto de datos contiene solo información de estado y estado y se filtra para devolver solo registros en un estado abierto. Los resultados se ordenan por estado. Se solicitan las tres primeras páginas. Los resultados tienen este aspecto:
Valor | Estado | Página |
---|---|---|
Apertura | Activas | 1 Inicio |
Apertura | Activas | 1 |
Apertura | Activas | 1 Fin |
Apertura | Activas | |
Apertura | Activas | |
Apertura | Inactivas | |
Apertura | Inactivas |
La cookie de paginación guarda información sobre el último registro de la página. Cuando se solicita la página siguiente, no se incluye el último registro de la primera página. Sin embargo, dados los datos no deterministas, no hay garantía de que los otros dos registros de la primera página no estén incluidos en la segunda página.
Para lograr un orden determinista, agregue pedidos en columnas que contengan valores únicos o valores semiúnicos.
Ejemplo determinista
Esta consulta es como la no determinista, pero incluye la columna Id. de caso que incluye valores únicos. También se ordena por Estado y por Id. de caso. Los resultados tienen este aspecto:
Valor | Estado | Id. de caso | Página |
---|---|---|---|
Apertura | Activas | Caso-0010 | 1 Inicio |
Apertura | Activas | Caso-0021 | 1 |
Apertura | Activas | Caso-0032 | 1 Fin |
Apertura | Activas | Caso-0034 | |
Apertura | Activas | Caso-0070 | |
Apertura | Inactivas | Caso-0015 | |
Apertura | Inactivas | Caso-0047 |
En la siguiente página, la cookie tendrá el Case-0032
almacenado como el último registro en la primera página, por lo que la página dos comenzará con el siguiente registro en el conjunto después de ese registro. Los resultados tienen este aspecto:
Valor | Estado | Id. de caso | Página |
---|---|---|---|
Apertura | Activas | Caso-0010 | 1 Inicio |
Apertura | Activas | Caso-0021 | 1 |
Apertura | Activas | Caso-0032 | 1 Fin |
Apertura | Activas | Caso-0034 | 2 Inicio |
Apertura | Activas | Caso-0070 | 2 |
Apertura | Inactivas | Caso-0015 | 2 Fin |
Apertura | Inactivas | Caso-0047 |
Dado que esta consulta ordena valores de columna únicos, el orden es coherente.
Procedimientos recomendados para órdenes al paginar datos
Nota
Cuando sea posible, las consultas deben ordenarse según la clave principal de la tabla porque Dataverse está optimizada para ordenar según la clave principal de forma predeterminada. Ordenar por campos no únicos o complejos genera una sobrecarga excesiva y consultas más lentas.
Cuando recupera un conjunto limitado de datos para mostrar en una aplicación, o si necesita devolver más de 5000 filas de datos, necesita paginar los resultados. Las elecciones que haga para determinar el orden de los resultados pueden determinar si las filas de cada página de datos que recupere se superponen con otras páginas. Sin un orden adecuado, el mismo registro puede aparecer en más de una página.
Para evitar que el mismo registro aparezca en más de una página, aplique los siguientes procedimientos recomendados:
Lo mejor es incluir una columna que tenga un identificador único. Por ejemplo:
- Columnas de clave principal de tabla
- Columnas de autonumeración
- Id. de usuario/contacto
Si no puede incluir una columna con un identificador único, incluya varios campos que probablemente darán como resultado combinaciones únicas. Por ejemplo:
- Nombre + apellido + dirección de correo electrónico
- Nombre completo + dirección de correo electrónico
- Dirección de correo electrónico + nombre de la empresa
Antipatrones para órdenes al paginar datos
Las siguientes son opciones de orden que se deben evitar:
Órdenes que no incluyen identificadores únicos
Órdenes en campos calculados
Órdenes que tienen campos únicos o múltiples que es poco probable que proporcionen unicidad, como:
- Estatus y estado
- Elecciones o Sí/No
- Nombre los valores por sí mismos. Por ejemplo
name
,firstname
,lastname
- Campos de texto como títulos, descripciones y texto de varias líneas
- Campos numéricos no únicos
Pasos siguientes
Aprenda a filtrar las filas.