Share via


Filtrar filas mediante FetchXml

Para establecer condiciones en las filas de datos a devolver, use el elemento de filtro dentro de una entidad, vínculo-entidad u otro elemento filter.

Para establecer las condiciones, agregue uno o más elementos de condición al filtro. El atributo que contiene filter type determina si todas (and) o cualquiera (or) de las condiciones deben cumplirse. El valor predeterminado es and. Al anidar elementos de filtro, puede crear criterios de filtro complejos que combinen criterios evaluados mediante and o or.

Cada condition tiene un atributo operator para evaluar el valor de una columna de fila. Hay muchos valores de operador de condición entre los que puede elegir.

Por ejemplo, la siguiente consulta devuelve todos los registros de cuentas donde address1_city es igual a 'Redmond'. Utiliza <filter type='and'> con el operador eq.

<fetch>
   <entity name='account'>
      <attribute name='name' />
      <filter type='and'>
         <condition attribute='address1_city'
            operator='eq'
            value='Redmond' />
      </filter>
   </entity>
</fetch>

Esta consulta devuelve los registros de cuenta donde address1_city es igual a 'Redmond', 'Seattle' o 'Bellevue'. Utiliza <filter type='or'> con tres elementos de condición y cada uno usa el operador eq.

<fetch>
   <entity name='account'>
      <attribute name='name' />
      <attribute name='address1_city' />
      <filter type='or'>
         <condition attribute='address1_city'
            operator='eq'
            value='Redmond' />
         <condition attribute='address1_city'
            operator='eq'
            value='Seattle' />
         <condition attribute='address1_city'
            operator='eq'
            value='Bellevue' />
      </filter>
   </entity>
</fetch>

La consulta anterior también se puede representar usando el operador in con un solo elemento condition . Esta condición contiene múltiples elementos de valor para especificar los valores a comparar con address1_city.

<fetch>
   <entity name='account'>
      <attribute name='name' />
      <attribute name='address1_city' />
      <filter type='and'>
         <condition attribute='address1_city'
            operator='in'>
            <value>Redmond</value>
            <value>Seattle</value>
            <value>Bellevue</value>
         </condition>
      </filter>
   </entity>
</fetch>

Parámetros de operador

Los operadores pueden no requerir ningún parámetro, un único parámetro o múltiples parámetros. El operador determina cómo se establece el valor a evaluar.

Sin parámetros

Algunos operadores no requieren ningún parámetro. Por ejemplo, puede utilizar el eoperador q-userid para evaluar cualquier identificador único y determinar si coincide con el Id. del usuario que llama.

<condition attribute='ownerid'
   operator='eq-userid' />

Un solo parámetro

Cuando un operador requiere un solo parámetro, use el atributo value para establecer el valor a evaluar. Por ejemplo, puede utilizar el operador eq para evaluar el valor de la columna de elección statecode de un registro estableciendo el atributo value.

<condition attribute='statecode'
   operator='eq'
   value='0' />

Varios parámetros

Cuando un operador requiere múltiples parámetros, use el elemento de valor para especificar los valores a evaluar. Por ejemplo, puede utilizar el operador between para evaluar un número y determinar si se encuentra entre un conjunto de valores.

<condition attribute="numberofemployees"
   operator="between">
   <value>6</value>
   <value>20</value>
</condition>

Cuando aplica un filtro en un vínculo-entidad, el filtro se aplicará con la combinación a menos que configure el filtro para que se produzca después de la combinación.

Cuando el valor del atributo vínculo-entidad link-type es outer, es posible que desee que el filtro se aplique después de la combinación configurando el valor del atributo condición entityname. Si está usando un vínculo-entidad alias, utilice el valor alias para establecer el atributo entityname. De lo contrario, establezca el valor del atributo entityname en el valor del atributo vínculo-entidad name.

Por ejemplo, la siguiente consulta devuelve contactos sin una cuenta primaria, o un cuenta primaria sin fax.

<fetch>
  <entity name='contact'>
    <attribute name='fullname' />
    <filter>
      <condition entityname='a'
        attribute='fax'
        operator='null' />
    </filter>
    <link-entity name='account'
      from='accountid'
      to='parentcustomerid'
      link-type='outer'
      alias='a' />
  </entity>
</fetch>

Filtrar por valores de columna en la misma fila

Puede crear filtros que comparen columnas con valores en la misma fila usando el atributo valueof. Por ejemplo, si desea encontrar cualquier registro de contacto en el que el valor de la columna firstname coincide con el valor de la columna lastname, puede utilizar esta consulta:

<fetch>
   <entity name='contact' >
      <attribute name='firstname' />
      <filter>
         <condition attribute='firstname'
            operator='eq'
            valueof='lastname' />
      </filter>
   </entity>
</fetch>

Comparaciones cruzadas de tablas

Con solo FetchXML, puede comparar valores de campo en tablas relacionadas. El siguiente ejemplo devuelve filas donde la columna contacto fullname coincide con la columna cuenta name .

<fetch>
   <entity name='contact'>
      <attribute name='contactid' />
      <attribute name='fullname' />
      <filter type='and'>
         <condition attribute='fullname'
            operator='eq'
            valueof='acct.name' />
      </filter>
      <link-entity name='account'
         from='accountid'
         to='parentcustomerid'
         link-type='outer'
         alias='acct'>
         <attribute name='name' />
      </link-entity>
   </entity>
</fetch>

El elemento elemento vínculo-entidad debe usar un atributo alias y el valor del parámetro valueof debe hacer referencia a ese alias y al nombre de la columna en la tabla relacionada.

Limitaciones de los filtros de comparación de columnas

Existen limitaciones para este tipo de filtros:

  • Condición solo puede usar estos operadores:

    Operator Descripción
    eq Los valores se comparan para igualdad.
    ne Los dos valores no son iguales.
    gt El valor es mayor que el valor comparado.
    ge El valor es mayor o igual que el valor comparado.
    lt El valor es menor que el valor comparado.
    le El valor es menor o igual que el valor comparado.
  • Solo se pueden comparar dos columnas a la vez

  • No se admiten operaciones de condición extendida. Por ejemplo: valueof='amount'+ 100

  • Las columnas deben ser del mismo tipo. Por ejemplo: no se puede comparar un valor de cadena con un valor numérico

Para filtrar valores en registros relacionados sin devolver esos valores, utilice un elemento de vínculo-entidad dentro del elemento de filtro con uno de los siguientes atributos link-type:

Name     Descripción
any Úselo dentro de un elemento de filtro. Restringe los resultados a las filas principales con filas coincidentes en la entidad vinculada.
not any Úselo dentro de un elemento de filtro. Restringe los resultados a las filas principales sin filas coincidentes en la entidad vinculada.
all Úselo dentro de un elemento de filtro. Restringe los resultados a las filas principales donde existen filas con un valor de columna from coincidente en la entidad de enlace, pero ninguna de esas filas coincidentes satisface los filtros adicionales definidos para esta entidad de vínculo. Necesita invertir los filtros adicionales para encontrar filas principales donde cada fila de entidad de enlace coincidente satisfaga algunos criterios adicionales.
not all Úselo dentro de un elemento de filtro. Restringe los resultados a las filas principales con filas coincidentes en la entidad vinculada. Este tipo de vínculo es equivalente a any a pesar del nombre.

Cuando utiliza estos tipos de enlaces dentro de un elemento de filtro, estos filtros son condiciones secundarias que siguen el comportamiento definido por el atributo type del filter primario.

Los filtros que utilizan estos tipos devuelven la fila principal como máximo una vez, incluso si existen varias filas coincidentes en la entidad de vínculo. No permiten devolver valores de columna de las filas de la entidad de vínculo.

Los siguientes ejemplos demuestran el filtrado de valores de registros relacionados. Estos ejemplos incluyen declaraciones SQL equivalentes para ayudar a explicar el comportamiento.

Esta consulta utiliza un filter de tipo or con un link-entity secundario de tipo any para devolver registros en contacto que:

<fetch>
   <entity name='contact'>
      <attribute name='fullname' />
      <filter type='or'>
         <link-entity name='account'
            from='primarycontactid'
            to='contactid'
            link-type='any'>
            <filter type='and'>
               <condition attribute='name'
                  operator='eq'
                  value='Contoso' />
            </filter>
         </link-entity>
         <condition attribute='statecode'
            operator='eq'
            value='1' />
      </filter>
   </entity>
</fetch>

Esta consulta utiliza el tipo de vínculo not any para devolver registros de la tabla contacto que no está referenciada por la columna de búsqueda PrimaryContactId de cualquier registro de cuenta que tenga su columna Nombre igual a 'Contoso'. Es posible que el registro de contacto siga siendo referenciado por registros de cuenta con otros valores de columna Nombre.

<fetch>
   <entity name='contact'>
      <attribute name='fullname' />
      <filter type='and'>
         <link-entity name='account'
            from='primarycontactid'
            to='contactid'
            link-type='not any'>
            <filter type='and'>
               <condition attribute='name'
                  operator='eq'
                  value='Contoso' />
            </filter>
         </link-entity>
      </filter>
   </entity>
</fetch>

Nota

El significado de los tipos de vínculo all y not all es lo opuesto a lo que podrían implicar los nombres y, por lo general, se usan con filtros invertidos:

  • Una entidad de vínculo de tipo not all es equivalente a any y devuelve registros principales que tienen registros de entidad de vínculo que coinciden con los filtros.
  • Una entidad de vínculo de tipo all devuelve registros principales cuando existen algunos registros de entidad de enlace con un valor de columna from coincidente pero ninguna de esas filas de entidad de vínculo satisface los filtros adicionales definidos dentro del elemento de entidad de vínculo.

Esta consulta utiliza un link-entity del tipo not all para devolver registros de la tabla contacto que están referenciados por la columna de búsqueda PrimaryContactId de como mínimo un registro de cuenta que tiene su Columna de nombre igual a 'Contoso':

<fetch>
   <entity name='contact'>
      <attribute name='fullname' />
      <filter type='and'>
         <link-entity name='account'
            from='primarycontactid'
            to='contactid'
            link-type='not all'>
            <filter type='and'>
               <condition attribute='name'
                  operator='eq'
                  value='Contoso' />
            </filter>
         </link-entity>
      </filter>
   </entity>
</fetch>

Esta consulta utiliza un link-entity del tipo all para devolver registros de la tabla contacto que son referenciados por la columna de búsqueda PrimaryContactId de algún registro de cuenta, pero ninguno de esos registros de cuenta tienen su Columna de nombre igual a 'Contoso':

<fetch>
   <entity name='contact'>
      <attribute name='fullname' />
      <filter type='and'>
         <link-entity name='account'
            from='primarycontactid'
            to='contactid'
            link-type='all'>
            <filter type='and'>
               <condition attribute='name'
                  operator='eq'
                  value='Contoso' />
            </filter>
         </link-entity>
      </filter>
   </entity>
</fetch>

Límites de las condiciones

No puede incluir más de 500 elementos condición y vínculo-entidad en una consulta FetchXml. De lo contrario, verá este error:

Nombre: TooManyConditionsInQuery
Código: 0x8004430C
Número: -2147204340
Mensaje: Number of conditions in query exceeded maximum limit.

Debe reducir la cantidad de condiciones para ejecutar la consulta. Es posible que pueda reducir la cantidad de condiciones utilizando el operador in que se puede usar con números, identificadores únicos y cadenas de hasta 850 caracteres.

Pasos siguientes

Aprenda a paginar resultados.

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).