Partekatu honen bidez:


Filtrado de 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 varios elementos de condición al filtro. El atributo contenedor filtertype determina si se deben cumplir todas las condiciones (and) o cualquiera (or). 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 operator atributo para evaluar un valor de columna de fila. Hay muchos valores de operador de condición entre los que elegir.

Por ejemplo, la consulta siguiente devuelve registros de cuenta donde address1_city es igual a "Redmond". Se 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 registros de cuenta donde address1_city es igual a "Redmond", "Seattle" o "Bellevue". Utiliza <filter type='or'> con tres elementos de condición, cada uno de los cuales utiliza 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 mediante el operador in con un solo condition elemento. Esta condición contiene varios elementos de valor para especificar los valores que se van 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 del operador

Los operadores no pueden requerir parámetros, un único parámetro o varios parámetros. El operador determina cómo se establece el valor que se va a evaluar.

Sin parámetros

Algunos operadores no requieren ningún parámetro. Por ejemplo, puede usar el operador eq-userid para evaluar cualquier identificador único para determinar si coincide con el identificador del usuario que realiza la llamada.

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

Parámetro único

Cuando un operador requiere un único parámetro, use el value atributo para establecer el valor que se va a evaluar. Por ejemplo, puede usar el operador eq para evaluar el statecode valor de columna de elección de un registro estableciendo el value atributo .

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

Varios parámetros

Cuando un operador requiere varios parámetros, use el elemento value para especificar los valores que se van a evaluar. Por ejemplo, puede usar el operador between para evaluar un número para determinar si está entre un conjunto de valores.

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

Al aplicar un filtro dentro de una entidad de vínculo, 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 link-entitylink-type es outer, es posible que desee que el filtro se aplique después de la combinación estableciendo el valor del atributo conditionentityname . Si usa una entidad de vínculoalias, use el valor alias para establecer el atributo entityname. De lo contrario, establezca el valor del atributo entityname al valor del atributo link-entityname.

Por ejemplo, la consulta siguiente devuelve contactos sin una cuenta primaria o una 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 en valores de la misma fila mediante el valueof atributo . Por ejemplo, si desea buscar registros de contacto en los que el firstname valor de columna coincide con el lastname valor de columna, puede usar esta consulta:

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

Comparaciones de columnas de tablas cruzadas

Solo con FetchXML, puede comparar valores de campo en tablas relacionadas. En el ejemplo siguiente se devuelven filas donde la columna contact fullname coincide con la columna account 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 link-entity debe usar un alias atributo y el valor del valueof parámetro debe hacer referencia a ese alias y al nombre de columna de la tabla relacionada.

Limitaciones en los filtros de comparación de columnas

Existen limitaciones en estos tipos de filtros:

  • La condición solo puede usar estos operadores:

    Operator Description
    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 los valores de los registros relacionados sin devolver esos valores, use un elemento link-entity dentro del elemento de filtro con uno de los atributos siguientes link-type :

Nombre Description
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 primarias sin filas coincidentes en la entidad vinculada.
all Úselo dentro de un elemento de filtro. Restringe los resultados a las filas primarias en las que existen filas con el valor de columna coincidente from en la entidad de vínculo, 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 se usan estos tipos de vínculo dentro de un elemento de filtro, estos filtros son condiciones secundarias siguiendo el comportamiento definido por el type atributo del elemento primario.filter

Los filtros que usan estos tipos devuelven la fila primaria 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.

En los ejemplos siguientes se muestra el filtrado de valores de registros relacionados. Estos ejemplos incluyen las instrucciones 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 usa el not any tipo de vínculo para devolver registros de la tabla de contactos a la que no hace referencia la columna de búsqueda PrimaryContactId de cualquier registro de cuenta que tenga su columna Name igual a "Contoso". Es posible que el registro de contacto aún sea referenciado por registros de cuenta con otros valores en la 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 enlace all y not all es el opuesto de lo que podrían implicar sus nombres, y se utilizan principalmente con filtros invertidos.

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

Esta consulta usa un link-entity de tipo not all para devolver registros de la tabla de contactos a la que hace referencia la columna de búsqueda PrimaryContactId de al menos un registro de cuenta que tiene su columna Name 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 usa un link-entity de tipo all para devolver registros de la tabla de contactos a la que hace referencia la columna de búsqueda PrimaryContactId de algún registro de cuenta, pero ninguno de esos registros de cuenta tiene su columna 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>

Restricciones de condición

No puede incluir más de 500 elementos de condición total y entidad de vínculo 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 el número de condiciones mediante el operador in que se puede usar con números, identificadores únicos y cadenas de hasta 850 caracteres.

Pasos siguientes

Obtenga información sobre cómo paginar los resultados.