Partager via


Filtrer des lignes à l’aide de FetchXml

Pour définir des conditions sur les lignes de données à retourner, utilisez l’élément de filtre dans une entité, une entité de lien ou un autre filter élément.

Pour définir les conditions, ajoutez un ou plusieurs éléments de condition au filtre. L’attribut filter contenant détermine si typetoutes (and) ou une (or) des conditions doivent être remplies. La valeur par défaut est and. En imbriquant les éléments de filtre, vous pouvez créer des critères complexes de filtre qui combinent des éléments évalués à l’aide de and ou or.

Chacun condition a un operator attribut pour évaluer une valeur de colonne de ligne. Il existe de nombreuses valeurs d’opérateur de condition à choisir.

Par exemple, la requête suivante retourne les enregistrements de compte où address1_city est égal à « Redmond ». Il utilise <filter type='and'> avec l’opérateur eq.

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

Cette requête retourne les enregistrements de compte où address1_city est égal à « Redmond », « Seattle » ou « Bellevue ». Il utilise <filter type='or'> avec trois éléments de condition qui utilisent chacun l’opérateur 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 requête précédente peut également être représentée à l’aide de l’opérateur in avec un seul condition élément. Cette condition contient plusieurs éléments de valeur pour spécifier les valeurs à comparer à 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>

Paramètres d’opérateur

Les opérateurs ne peuvent nécessiter aucun paramètre, un seul paramètre ou plusieurs paramètres. L’opérateur détermine la façon dont vous définissez la valeur à évaluer.

Aucun paramètre

Certains opérateurs ne nécessitent aucun paramètre. Par exemple, vous pouvez utiliser l’opérateur eq-userid pour évaluer n’importe quel identificateur unique pour déterminer s’il correspond à l’ID de l’utilisateur appelant.

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

Paramètre unique

Lorsqu’un opérateur nécessite un paramètre unique, utilisez l’attribut value pour définir la valeur à évaluer. Par exemple, vous pouvez utiliser l’opérateur eq pour évaluer la statecode valeur de colonne de choix d’un enregistrement en définissant l’attribut value .

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

Paramètres multiples

Lorsqu’un opérateur nécessite plusieurs paramètres, utilisez l’élément valeur pour spécifier les valeurs à évaluer. Par exemple, vous pouvez utiliser l’opérateur entre pour évaluer un nombre pour déterminer s’il se trouve entre un ensemble de valeurs.

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

Lorsque vous appliquez un filtre dans une entité de lien, le filtre est appliqué avec la jointure, sauf si vous configurez le filtre pour qu’il se produise après la jointure.

Lorsque la valeur de l’attribut link-entitylink-type est outer, vous souhaiterez peut-être que le filtre soit appliqué après la jointure en définissant la valeur d’attribut de conditionentityname . Si vous utilisez une entité de lienalias, utilisez la alias valeur pour définir l’attributentityname. Sinon, définissez la valeur de l’attribut entityname sur la valeur de l’attribut link-entityname .

Par exemple, la requête suivante retourne des contacts sans compte parent ou un compte parent sans télécopie.

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

Filtrer sur les valeurs de colonne dans la même ligne

Vous pouvez créer des filtres qui comparent des colonnes sur des valeurs dans la même ligne à l’aide de l’attribut valueof . Par exemple, si vous souhaitez rechercher des enregistrements de contact où la firstname valeur de colonne correspond à la lastname valeur de colonne, vous pouvez utiliser cette requête :

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

Comparaisons croisées entre colonnes de tableau

Avec FetchXML uniquement, vous pouvez comparer les valeurs de champ dans les tables associées. L’exemple suivant retourne des lignes où la fullname colonne contact correspond à la colonne de compte 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>

L’élément link-entity doit utiliser un alias attribut et la valeur du valueof paramètre doit référencer cet alias et le nom de colonne dans la table associée.

Limitations sur les filtres de comparaison de colonnes

Il existe des limitations sur ces types de filtres :

  • La condition peut uniquement utiliser ces opérateurs :

    Operator Descriptif
    eq Les valeurs sont comparées pour l’égalité.
    ne Les deux valeurs ne sont pas égales.
    gt La valeur est supérieure à la valeur comparée.
    ge La valeur est supérieure ou égale à la valeur comparée.
    lt La valeur est inférieure à la valeur comparée.
    le La valeur est inférieure ou égale à la valeur comparée.
  • Seules deux colonnes peuvent être comparées à la fois

  • Les opérations de condition étendues ne sont pas prises en charge. Par exemple : valueof='amount'+ 100

  • Les colonnes doivent être du même type. Par exemple : Vous ne pouvez pas comparer une valeur de chaîne à une valeur numérique

Pour filtrer les valeurs dans les enregistrements associés sans renvoyer ces valeurs, utilisez un élément d’entité de lien dans l’élément de filtre avec l’un des attributs suivants link-type :

Nom Descriptif
any Utilisez ce paramètre dans un élément de filtre. Restreint les résultats aux lignes parentes avec toutes les lignes correspondantes dans l’entité liée.
not any Utilisez ce paramètre dans un élément de filtre. Restreint les résultats aux lignes parentes sans lignes correspondantes dans l’entité liée.
all Utilisez ce paramètre dans un élément de filtre. Restreint les résultats aux lignes parentes où il existe des lignes avec une valeur de colonne from correspondante dans l’entité de lien, mais aucune de ces lignes correspondantes ne satisfait aux filtres supplémentaires définis pour cette entité de lien. Vous devez inverser les filtres supplémentaires pour trouver des lignes parentes où chaque ligne d’entité de lien correspondante satisfait à certains critères supplémentaires.
not all Utilisez ce paramètre dans un élément de filtre. Restreint les résultats aux lignes parentes avec toutes les lignes correspondantes dans l’entité liée. Ce type de lien est équivalent à any malgré le nom.

Lorsque vous utilisez ces types de liens à l’intérieur d’un élément de filtre, ces filtres sont des conditions enfants qui suivent le comportement défini par l’attribut type du parent filter.

Les filtres utilisant ces types retournent la ligne parente au plus une fois même si plusieurs lignes correspondantes existent dans l’entité de lien. Ils ne permettent pas de renvoyer les valeurs de colonne à partir des lignes d’entité de lien.

Les exemples suivants illustrent le filtrage sur les valeurs des enregistrements associés. Ces exemples incluent les instructions SQL équivalentes pour expliquer le comportement.

Cette requête utilise un filter de type or avec un link-entity enfant de type any pour renvoyer les enregistrements dans contact qui :

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

Cette requête utilise le not any type de lien pour renvoyer les enregistrements de la table de contacts qui n’est pas référencée par la colonne de recherche PrimaryContactId d’un enregistrement de compte dont la colonne Name est égale à « Contoso ». L’enregistrement de contact peut toujours être référencé par les enregistrements de compte avec d'autres valeurs de la colonne Nom.

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

Note

La signification des types de liens all et not all est à l'opposé de ce que les dénominations pourraient laisser entendre, et ils sont généralement utilisés avec des filtres inversés :

  • Une entité de lien de type not all est équivalente à any et retourne les enregistrements parents dont les entités de lien correspondent aux filtres.
  • Une entité de lien de type all retourne des enregistrements parents lorsque certains enregistrements d’entité de lien avec une valeur de colonne correspondante from existent, mais qu’aucune de ces lignes d’entité de liaison ne satisfait les filtres supplémentaires définis à l’intérieur de l’élément link-entity.

Cette requête utilise un link-entity type not all pour retourner des enregistrements de la table de contacts référencées par la colonne de recherche PrimaryContactId d’au moins un enregistrement de compte dont la colonne Name est égale à « 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>

Cette requête utilise un link-entity de type all pour renvoyer les enregistrements de la table contact qui sont référencés par la colonne de recherche PrimaryContactId de certainsenregistrements de comptemais aucunde cesenregistrementsde compte n'ont leur Colonne de nom égale à « 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>

Limites des conditions

Vous ne pouvez pas inclure plus de 500 éléments de condition totale et d’entité de liaison dans une requête FetchXml. Sinon, cette erreur s’affiche :

Nom : TooManyConditionsInQuery
Code : 0x8004430C
Nombre : -2147204340
Message : Number of conditions in query exceeded maximum limit.

Vous devez réduire le nombre de conditions pour exécuter la requête. Vous pouvez peut-être réduire le nombre de conditions à l’aide de l’opérateur in qui peut être utilisé avec des nombres, des identificateurs uniques et des chaînes allant jusqu’à 850 caractères.

Étapes suivantes

Découvrez comment paginer les résultats.