Freigeben über


Zeilen mithilfe von FetchXml filtern

Um Bedingungen für die zurückzugebenden Datenzeilen festzulegen, verwenden Sie das Filterelement innerhalb einer Entität, Link-Entität oder einem anderen filter-Element.

Um die Bedingungen festzulegen, fügen Sie dem Filter ein oder mehrere Bedingungselemente hinzu. Das enthaltende Attribut filter type bestimmt, ob alle (and) oder irgendeine (or) der Bedingungen erfüllt sein müssen. Der Standardwert ist and. Durch die Verschachtelung von Filterelementen können Sie komplexe Filterkriterien erstellen, die mit and oder or ausgewertete Kriterien kombinieren.

Jede condition verfügt über ein operator-Attribut zum Auswerten eines Zeilenspaltenwerts. Es stehen viele Bedingungsoperatorwerte zur Auswahl zur Verfügung.

Die folgende Abfrage gibt z. B. alle Kontodatensätze, bei denen address1_city gleich „Redmond” ist. Sie 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, bei denen address1_city „Redmond“, „Seattle” oder „Bellevue” entspricht. Sie 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>

Die vorherige Abfrage kann auch mit dem in-Operator mit einem einzelnen condition-Element dargestellt werden. Diese Bedingung enthält mehrere Wertelemente zur Angabe der zu vergleichenden Werte mit 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>

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. Sie können beispielsweise den eq-userid-Operator verwenden, um jeden eindeutigen Bezeichner auszuwerten, um festzustellen, ob sie mit der ID des aufrufenden Benutzenden übereinstimmt.

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

Einzelner Parameter

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

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

Mehrere Parameter

Wenn ein Operator mehrere Parameter erfordert, verwenden Sie das Wertelement, um die auszuwertenden Werte anzugeben. Sie können zum Beispiel den Zwischen-Operator verwenden, um eine Zahl auszuwerten, um festzustellen, ob sie zwischen einer Reihe von Werten liegt.

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

Wenn Sie einen Filter innerhalb einer Link-Entität anwenden, wird der Filter mit der Verknüpfung angewendet, es sei denn, Sie konfigurieren den Filter so, dass er nach der Verknüpfung auftritt.

Wenn der Link-Entität link-type-Attributwert outer ist, möchten Sie möglicherweise, dass der Filter nach der Verknüpfung angewendet wird, indem Sie den Bedingungs-entityname-Attributwert festlegen. Wenn Sie eine Link-Entität alias verwenden, verwenden Sie den alias-Wert, um das entityname-Attribut festzulegen. Legen Sie andernfalls den entityname-Attributwert auf den Link-Entitäts-name-Attributwert 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>

Nach Spaltenwerten in derselben Zeile filtern

Sie können Filter erstellen, die Spalten anhand von Werten in derselben Zeile mithilfe des valueof-Attributs vergleichen. Wenn Sie beispielsweise Kontaktdatensätze finden möchten, in denen der firstname-Spaltenwert dem lastname-Spaltenwert entspricht, können Sie diese Abfrage verwenden:

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

Tabellenübergreifende Spaltenvergleiche

Mit nur FetchXML können Sie nur Feldwerte in zugehörigen Tabellen vergleichen. Das folgende Beispiel gibt Zeilen zurück, in denen die Spalte Kontakt fullname mit der Spalte Konto name übereinstimmt.

<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 Link-Entitätselement muss ein alias-Attribut verwenden und der Wert des valueof-Parameters muss auf diesen Alias und den Spaltennamen in der zugehörigen Tabelle verweisen.

Einschränkungen für Spaltenvergleichsfilter

Für diese Art von Filtern gelten Einschränkungen:

  • Bedingung kann nur diese Operatoren verwenden:

    Operator Beschreibung
    eq Die Werte werden auf 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 verglichenen Wert.
    lt Der Wert ist kleiner als der Vergleichswert.
    le Der Wert ist kleiner als oder gleich dem verglichenen Wert.
  • Es können jeweils nur zwei Spalten verglichen werden

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

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

Um nach Werten in zugehörigen Datensätzen zu filtern, ohne diese Werte zurückzugeben, verwenden Sie ein Link-Entitätselement innerhalb des Filterelements mit einem der folgenden link-type-Attribute:

Name des Dataflows     Beschreibung
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, in denen Zeilen mit übereinstimmendem from-Spaltenwert in der Link-Entität vorhanden sind, aber keine dieser übereinstimmenden Zeilen erfüllen die für die Link-Entität definierten zusätzlichen Filter. Sie müssen die zusätzlichen Filter umkehren, um übergeordnete Zeilen zu finden, in denen jede übereinstimmende Link-Entitä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 Linktypen innerhalb eines Filterelements verwenden, sind diese Filter untergeordnete Bedingungen, die dem durch das type-Attribut des übergeordneten filter-Elements definierten Verhalten folgen.

Filter, die diese Typen verwenden, geben die übergeordnete Zeile höchstens einmal zurück, selbst wenn in der Link-Entität mehrere übereinstimmende Zeilen vorhanden sind. Sie erlauben keine Rückgabe von Spaltenwerten aus den Link-Entitätszeilen.

Die folgenden Beispiele veranschaulichen das Filtern nach Werten verknüpfter Datensätze. Diese Beispiele umfassen 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 Linktyp not any, um Datensätze aus der Tabelle Kontakt zurückzugeben, die nicht durch die PrimaryContactId-Suchspalte jedes Konto-Datensatzes referenziert werden, bei dem die Namensspalte gleich „Contoso“ ist. Auf den Kontaktdatensatz verweisen möglicherweise noch Kontodatensätze mit anderen Namensspalten-Werten.

<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 dessen, was die Namen andeuten könnten, und sie werden normalerweise mit invertierten Filtern verwendet:

  • Eine Link-Entität vom Typ not all entspricht any und gibt übergeordnete Datensätze zurück, deren Link-Entitätsdatensätze den Filtern entsprechen.
  • Eine Link-Entität vom Typ all gibt übergeordnete Datensätze zurück, wenn einige Link-Entitätsdatensätze mit einem passenden from-Spaltenwert vorhanden sind, aber keine dieser Link-Entitätszeilen die zusätzlichen Filter erfüllen, die im Link-Entitätselement definiert sind.

Diese Abfrage verwendet eine link-entity des Typs not all, um Datensätze aus der Tabelle Kontakt zurückzugeben, die durch die PrimaryContactId-Suchspalte mindestens eines Konto-Datensatzes referenziert werden, bei dem die Namensspalte gleich „Contoso“ ist:

<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 eine link-entity des Typs all, um Datensätze aus der Tabelle Kontakt zurückzugeben, die durch die PrimaryContactId-Suchspalte einige Konto-Datensätze referenziert werden, aber keine dieser Konto-Datensätze, bei denen die Namensspalte gleich „Contoso“ ist:

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

Grenzwerte für Bedingungen

Sie können insgesamt nicht mehr als 500 Bedingungs- und Link-Entitäts-Elemente in eine FetchXml-Abfrage einschließen. Andernfalls wird dieser Fehler angezeigt:

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

Sie müssen die Anzahl der Bedingungen zum Ausführen der Abfrage reduzieren. Möglicherweise können Sie die Anzahl der Bedingungen reduzieren, indem Sie den in-Operator verwenden, der mit Zahlen, eindeutigen Bezeichnern und Zeichenfolgen mit bis zu 850 Zeichen verwendet werden kann.

Nächste Schritte,

Erfahren Sie, wie Sie Ergebnisse auslagern.

Hinweis

Können Sie uns Ihre Präferenzen für die Dokumentationssprache mitteilen? Nehmen Sie an einer kurzen Umfrage teil. (Beachten Sie, dass diese Umfrage auf Englisch ist.)

Die Umfrage dauert etwa sieben Minuten. Es werden keine personenbezogenen Daten erhoben. (Datenschutzbestimmungen).