Implemente todos los tipos de consultas al filtrar resultados mediante PreOperation RetrieveMultiple

Categoría: Diseño, rendimiento, seguridad, compatibilidad

Potencial de impacto: medio

Síntomas

Las llamadas de RetrieveMultiple desde diferentes aplicaciones muestran resultados diferentes.

  • Por ejemplo: las mismas vistas en aplicaciones heredadas muestran diferentes resultados en nuevas aplicaciones.

Instrucciones

Nota

Los mensajes Retrieve y RetrieveMultiple suelen ser los mensajes más comunes. Los complementos para estos mensajes pueden afectar de forma significativa el rendimiento del sistema. Generalmente, debe evitar el uso de complementos para estos mensajes si los requisitos se pueden conseguir de algún otro modo. Más información: Limitar el registro de complementos para los mensajes Retrieve y de RetrieveMultiple

Los complementos registrados en el mensaje RetrieveMultiple se proporcionan normalmente para filtrar los resultados devueltos por las consultas de una entidad. Hay dos estrategias para hacerlo con un complemento registrado en las fases PostOperation o PreOperation.

Filtrado PostOperation

En la fase PostOperation, evalúe los registros devueltos en la propiedad OutputParameters BusinessEntityCollection Entities y quite las entidades que no deben ser devueltas.

Este método cambia potencialmente el número de registros esperado devueltos en cada página de resultados y puede producir experiencias incoherentes cuando los datos se muestra en una aplicación.

Filtrado PreOperation

En la fase PreOperation, evalúe la propiedad InputParameters Query y ajuste la consulta para filtrar qué se devolverá antes de que se ejecute.

Cuando se usa este método debe implementar el filtrado adecuado para los diferentes tipos posibles de consultas, sobre todo: FetchExpression yQueryExpression. Si implementa solo uno de estos, distintas aplicaciones que usan el otro tipo de consulta no aplican los cambios.

Aunque los mensajes QueryExpressionToFetchXml y FetchXmlToQueryExpression proporcionan la capacidad de convertir un tipo de consulta en otro, debido al impacto de rendimiento de incluir llamadas adicionales en RetrieveMultiple, se recomienda no usar estos mensajes en este contexto. En su lugar, implemente el filtrado mediante la lógica equivalente en ambos.

Hay un tercer tipo de consulta que también puede ser usado con RetrieveMultiple: QueryByAttribute. Este tipo de consulta no proporciona filtrado complejo y no es posible incluir una lógica de filtrado más compleja en un complemento. Afortunadamente, este tipo de consulta no se usa con frecuencia. Según la sensibilidad del filtrado que agrega, puede elegir rechazar consultas de este tipo lanzando una InvalidPluginExecutionException.

Ejemplo

Vea Ejemplo: Modificar consulta en fase PreOperation para un ejemplo de la estrategia que se recomienda.

Patrones problemáticos

Cuando alguien escribe un complemento para cambiar los registros devueltos en una aplicación específica que usa solo un tipo de consulta usado por esa aplicación, FetchExpression oQueryExpression, es posible que los resultados no sean coherentes en otras aplicaciones o si la aplicación cambia el tipo de consulta usado. Escriba complementos que proporcionen el mismo resultado sin importar la aplicación.

Información adicional

Cuando se usa API web, las solicitudes GET en una colección se convierten a QueryExpression a menos que la consulta use FetchXml como se describe en Recuperar y ejecutar consultas predefinidas. En ese caso, las consultas usan FetchExpression.

La interfaz unificada sustituyó al cliente web heredado para las aplicaciones basadas en modelos. La interfaz unificada usa el FetchXml definido en las propiedades de SavedQuery.FetchXml o UserQuery.FetchXml. Para mejorar el rendimiento, la interfaz unificada no convierte los datos de FetchXml a una QueryExpression antes de ejecutar estas consultas como hizo el cliente web heredado. Por tanto, las consultas que se modificaron en código de complemento para el cliente web heredado que utilizaba QueryExpression no aplican los mismos cambios ahora que la consulta para admitir vistas se está pasando mediante FetchExpression a menos que el código de complemento se escriba para aplicar la misma lógica a consultas FetchExpression.

Vea también

Ejemplo: Modificar consulta en fase PreOperation
Consulta de datos usando SDK para .NET
Consultar datos mediante FetchXML
Crear consultas con QueryExpression
Limitar el registro de complementos para los mensajes Retrieve y de RetrieveMultiple
Comunidad de interfaz unificada

Nota

¿Puede indicarnos sus preferencias de idioma de documentación? Realice una breve encuesta. (tenga en cuenta que esta encuesta está en inglés)

La encuesta durará unos siete minutos. No se recopilan datos personales (declaración de privacidad).