Freigeben über


Filtern von Zeilen mithilfe von FetchXML

Um Bedingungen für die zurückzugebenden Datenzeilen festzulegen, verwenden Sie das Filterelement innerhalb einer Entität, Linkentität oder eines anderen filter Elements.

Um die Bedingungen festzulegen, fügen Sie dem Filter mindestens ein Bedingungselement hinzu. Das enthaltende filtertype Attribut bestimmt, ob alle (and) oder irgendeine (or) der Bedingungen erfüllt sein müssen. Der Standardwert lautet and. Durch das Verschachteln von Filterelementen, können Sie komplexe Filterkriterien erstellen, die Kriterien kombinieren, die mit and oder or bewertet werden.

Jedes condition hat ein operator Attribut, um einen Zeilen- und Spaltenwert auszuwerten. Sie können aus vielen Bedingungsoperatorwerten wählen.

Die folgende Abfrage gibt beispielsweise Kontodatensätze zurück, wobei address1_city "Redmond" entspricht. Es verwendet <filter type='and'> mit dem eq-Operator.

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

Diese Abfrage gibt Kontodatensätze zurück, wobei address1_city "Redmond", "Seattle" oder "Bellevue" gleich ist. Es verwendet <filter type='or'> mit drei Bedingungselementen, die jeweils den eq-Operator verwenden.

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

Sie können die vorherige Abfrage auch mithilfe des in-Operators mit einem einzelnen condition-Element darstellen. Diese Bedingung enthält mehrere Wertelemente , um die zu vergleichenden address1_cityWerte anzugeben.

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

Operatorparameter

Operatoren können keine Parameter, einen einzelnen Parameter oder mehrere Parameter erfordern. Der Operator bestimmt, wie Sie den auszuwertenden Wert festlegen.

Keine Parameter

Einige Operatoren erfordern keine Parameter. Verwenden Sie z. B. den Eq-userid-Operator , um einen eindeutigen Bezeichner auszuwerten und zu ermitteln, ob er mit der ID des aufrufenden Benutzers übereinstimmt.

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

Einzelner Parameter

Wenn ein Operator einen einzelnen Parameter erfordert, verwenden Sie das value Attribut, um den auszuwertenden Wert festzulegen. Verwenden Sie beispielsweise den Eq-Operator , um den statecode Auswahlspaltenwert eines Datensatzes auszuwerten, indem Sie das value Attribut festlegen.

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

Mehrere Parameter

Wenn ein Operator mehrere Parameter erfordert, verwenden Sie das Wertelement , um die zu bewertenden Werte anzugeben. Verwenden Sie z. B. den Zwischenoperator , um eine Zahl auszuwerten, um festzustellen, ob es sich zwischen einer Gruppe von Werten befindet.

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

Wenn Sie einen Filter innerhalb einer Verknüpfungsentität anwenden, wird der Filter in Verbindung mit der Verknüpfung angewendet, es sei denn, Sie konfigurieren den Filter nach der Verknüpfung.

Wenn der Wert des Attributs "link-entitylink-type " lautet outer, sollten Sie den Filter nach der Verknüpfung anwenden, indem Sie den Wert des Bedingungsattributsentityname festlegen. Wenn Sie eine Linkentitätalias verwenden, verwenden Sie den alias Wert, um das entityname Attribut festzulegen. Legen Sie andernfalls den entityname Attributwert auf den Wert des Attributs "link-entityname " fest.

Die folgende Abfrage gibt beispielsweise Kontakte ohne übergeordnetes Konto oder ein übergeordnetes Konto ohne Fax zurück.

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

Filtern nach Spaltenwerten in derselben Zeile

Mithilfe des valueof Attributs können Sie Filter erstellen, die Spalten für Werte in derselben Zeile vergleichen. Wenn Sie beispielsweise Kontaktdatensätze suchen möchten, bei denen der firstname Spaltenwert mit dem lastname Spaltenwert übereinstimmt, verwenden Sie diese Abfrage:

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

Tabellenübergreifende Spaltenvergleiche

Wenn Sie nur FetchXML verwenden, können Sie Feldwerte in verknüpften Tabellen vergleichen. Im folgenden Beispiel werden Zeilen zurückgegeben, in denen die Kontaktspalte fullname der Kontospalte name entspricht.

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

Das Linkentitätselement muss ein alias Attribut verwenden, und der Wert des valueof Parameters muss auf diesen Alias und den Spaltennamen in der verknüpften Tabelle verweisen.

Einschränkungen bei Spaltenvergleichsfiltern

Diese Arten von Filtern weisen die folgenden Einschränkungen auf:

  • Bedingung kann nur diese Operatoren verwenden:

    Bediener Description
    eq Die Werte werden für Gleichheit verglichen.
    ne Die beiden Werte sind nicht gleich.
    gt Der Wert ist größer als der Vergleichswert.
    ge Der Wert ist größer oder gleich dem Vergleichswert.
    lt Der Wert ist kleiner als der Vergleichswert.
    le Der Wert ist kleiner oder gleich dem Vergleichswert.
  • Sie können jeweils nur zwei Spalten vergleichen.

  • Erweiterte Bedingungsvorgänge werden nicht unterstützt. Beispiel: valueof='amount'+ 100.

  • Die Spalten müssen den gleichen Typ haben. Beispiel: Sie können einen Zeichenfolgenwert nicht mit einem Zahlenwert vergleichen.

Wenn Sie nach Werten in verknüpften Datensätzen filtern möchten, ohne diese Werte zurückzugeben, verwenden Sie ein Linkentitätselement innerhalb des Filterelements mit einem der folgenden link-type Attribute:

Name Description
any Verwenden Sie dies innerhalb eines Filterelements. Beschränkt die Ergebnisse auf übergeordnete Zeilen mit allen übereinstimmenden Zeilen in der verknüpften Entität.
not any Verwenden Sie dies innerhalb eines Filterelements. Beschränkt die Ergebnisse auf übergeordnete Zeilen ohne übereinstimmende Zeilen in der verknüpften Entität.
all Verwenden Sie dies innerhalb eines Filterelements. Beschränkt die Ergebnisse auf übergeordnete Zeilen, bei denen Zeilen mit übereinstimmenden from Spaltenwert in der Verknüpfungsentität vorhanden sind, aber keine dieser übereinstimmenden Zeilen die zusätzlichen Filter erfüllen, die für diese Verknüpfungsentität definiert sind. Sie müssen die zusätzlichen Filter umkehren , um nach übergeordneten Zeilen zu suchen, bei denen jede übereinstimmende Verknüpfungsentitätszeile einige zusätzliche Kriterien erfüllt.
not all Verwenden Sie dies innerhalb eines Filterelements. Beschränkt die Ergebnisse auf übergeordnete Zeilen mit allen übereinstimmenden Zeilen in der verknüpften Entität. Dieser Linktyp entspricht any trotz des Namens.

Wenn Sie diese Verknüpfungstypen innerhalb eines Filterelements verwenden, sind diese Filter untergeordnete Bedingungen, die dem vom type Attribut des übergeordneten Elements filterdefinierten Verhalten entsprechen.

Filter, die diese Typen verwenden, geben die übergeordnete Zeile höchstens einmal zurück, auch wenn mehrere übereinstimmende Zeilen in der Verknüpfungsentität vorhanden sind. Sie geben keine Spaltenwerte aus den Zeilen der Verknüpfungsentität zurück.

Die folgenden Beispiele veranschaulichen das Filtern nach Werten verwandter Datensätze. Zu diesen Beispielen gehören die entsprechenden SQL-Anweisungen, um das Verhalten zu erläutern.

Diese Abfrage verwendet einen filter vom Typ or mit einer untergeordneten link-entity vom Typ any, um Datensätze in Kontakt zurückgeben, die:

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

Diese Abfrage verwendet den not any Link-Typ, um Datensätze aus der Kontakttabelle zurückzugeben, die nicht von der PrimaryContactId-Nachschlagespalte eines Kontodatensatzes verwiesen werden, dessen Name-Spalte gleich ist wie Contoso. Auf den Kontaktdatensatz wird möglicherweise weiterhin von Kontodatensätzen mit anderen"Name"-Spaltenwerten verwiesen.

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

Hinweis

Die Bedeutung der Linktypen all und not all ist das Gegenteil von dem, was die Namen vermuten lassen, und sie werden typischerweise mit invertierten Filtern verwendet:

  • Eine Verknüpfungsentität des Typs not all entspricht any und gibt übergeordnete Datensätze zurück, die Verknüpfungsentitätseinträge aufweisen, die den Filtern entsprechen.
  • Eine Verknüpfungsentität vom Typ all gibt übergeordnete Datensätze zurück, wenn einige Verknüpfungsentitätseinträge mit einem übereinstimmenden from Spaltenwert vorhanden sind, aber keine dieser Verknüpfungsentitätszeilen die zusätzlichen Filter erfüllen, die innerhalb des Linkentitätselements definiert sind.

Diese Abfrage verwendet einen link-entity des Typs not all, um Datensätze aus der Kontakttabelle zurückzugeben, auf die von der Nachschlagespalte "PrimaryContactId" eines oder mehrerer Kontodatensätze verwiesen wird. Diese Kontodatensätze haben die Name-Spalte gleich 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>

Diese Abfrage verwendet einen link-entity Typall, um Datensätze aus der Kontakttabelle zurückzugeben, auf die von der PrimaryContactId-NachschlagespalteeinesKontodatensatzes verwiesen wird, aber keine dieser Kontodatensätze hat ihre Name-Spalte gleichContoso:

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

Bedingungsgrenzen

Sie können bis zu 500 Gesamtbedingungs - und Verknüpfungsentitätselemente in eine FetchXML-Abfrage einschließen. Andernfalls wird diese Fehlermeldung angezeigt:

Name: TooManyConditionsInQuery
Code: 0x8004430C
Zahl: -2147204340
Meldung: Number of conditions in query exceeded maximum limit.

Sie müssen die Anzahl der Bedingungen verringern, um die Abfrage auszuführen. Möglicherweise können Sie die Anzahl der Bedingungen reduzieren, indem Sie den In-Operator verwenden, den Sie mit Zahlen, eindeutigen Bezeichnern und Zeichenfolgen bis zu 850 Zeichen verwenden können.

Nächste Schritte

Erfahren Sie, wie Sie Die Ergebnisse auf der Seite anzeigen.