次の方法で共有


FetchXML を使用して行をフィルター処理する

返すデータ行に条件を設定するには、エンティティリンク エンティティ、または別の要素内のfilter要素を使用します。

条件を設定するには、フィルターに 1 つ以上の 条件要素 を追加します。 包含 filtertype 属性は、 条件のすべて (and) または 任意 の (or) を満たす必要があるかどうかを決定します。 既定値は andです。 フィルター要素を入れ子にすると、 and または orを使用して評価された条件を組み合わせた複雑なフィルター条件を作成できます。

condition には、行列の値を評価するための operator 属性があります。 多くの 条件演算子値から選択できます。

たとえば、次のクエリは、 address1_city が "Redmond" と等しいアカウント レコードを返します。 <filter type='and'>を使用します。

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

このクエリは、 address1_city が "Redmond"、"Seattle"、または "Bellevue" と等しいアカウント レコードを返します。 <filter type='or'>は3つの条件要素を使用し、それぞれが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>

1 つの要素で conditionを使用して、前のクエリを表すこともできます。 この条件には、と比較する値を指定する複数の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>

演算子パラメーター

演算子は、パラメーターを必要としない、1つのパラメーターのみを必要とする、または複数のパラメーターを必要とする場合があります。 演算子によって、評価する値の設定方法が決まります。

パラメーターがない

一部の演算子では、パラメーターは必要ありません。 たとえば、 eq-userid 演算子 を使用して一意の識別子を評価し、呼び出し元のユーザーの ID と一致するかどうかを判断します。

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

単一パラメーター

演算子に 1 つのパラメーターが必要な場合は、 value 属性を使用して評価する値を設定します。 たとえば、eq 演算子を使用して、statecode属性を設定して、レコードのvalue選択列の値を評価します。

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

複数のパラメーター

演算子に複数のパラメーターが必要な場合は、 value 要素 を使用して評価する値を指定します。 たとえば、 between 演算子 を使用して数値を評価し、値のセットの間にあるかどうかを判断します。

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

リンク エンティティ内でフィルターを適用すると、結合に発生するようにフィルターを構成しない限り、フィルターは結合と共に適用されます。

link-entitylink-type属性値がouterされている場合は、条件entityname属性値を設定して、結合の後にフィルターを適用できます。 リンク エンティティを使用している場合aliasalias値を使用してentityname属性を設定します。 それ以外の場合は、 entityname 属性値を link-entityname 属性値に設定します。

たとえば、次のクエリでは、 親アカウントのない連絡先、または 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>

同じ行の列値をフィルター処理する

valueof属性を使用して、同じ行の値の列を比較するフィルターを作成できます。 たとえば、 firstname 列の値が lastname 列の値と一致する連絡先レコードを検索する場合は、次のクエリを使用します。

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

クロス集計表の列比較

FetchXML のみを使用すると、関連テーブルのフィールド値を比較できます。 次の例では、連絡先 fullname 列が取引先企業 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>

リンク エンティティ要素alias属性を使用する必要があり、valueof パラメーターの値は、そのエイリアスと関連テーブル内の列名を参照する必要があります。

列比較フィルターの制限事項

これらの種類のフィルターには、次の制限があります。

  • 条件 では、次の 演算子のみを使用できます。

    Operator Description
    eq 値が等しいかどうかを比較します。
    ne 2 つの値が等しくありません。
    gt 値が比較値より大きい。
    ge 値が比較値以上です。
    lt 値が比較値より小さい。
    le 値が比較値以下です。
  • 一度に比較できる列は 2 つだけです。

  • 拡張条件操作はサポートされていません。 たとえば、 valueof='amount'+ 100と指定します。

  • 列は同じ型である必要があります。 たとえば、文字列値と数値を比較することはできません。

これらの値を返さずに関連レコードの値をフィルター処理するには、フィルター要素内のリンク エンティティ要素を使用し、次のいずれかのlink-type属性を使用します。

名前 Description
any フィルター要素内でこれを使用します。 結果を、リンクされたエンティティ内の一致する行を持つ親行に制限します。
not any フィルター要素内でこれを使用します。 リンクされたエンティティに一致する行がない親行に結果を制限します。
all フィルター要素内でこれを使用します。 リンク エンティティに一致する from 列の値を持つ行が存在するが、それらの一致する行のうち、どの行も このリンク エンティティに定義されている追加のフィルターを満たしていない親行に結果を制限します。 追加フィルタを反転して、一致するリンク エンティティ行がすべて追加条件を満たす親行を見つける必要があります。
not all フィルター要素内でこれを使用します。 結果を、リンクされたエンティティ内の一致する行を持つ親行に制限します。 このリンクの種類は、名前にもかかわらず any に相当します。

フィルター要素内でこれらのリンクの種類を使用する場合、これらのフィルターは、親typefilter属性によって定義された動作に従う子条件です。

これらの型を使用するフィルターは、リンク エンティティに複数の一致する行が存在する場合でも、親行を最大で 1 回返します。 リンク エンティティ行から列の値が返されることはありません。

次の例では、関連レコードの値をフィルター処理する方法を示します。 これらの例には、動作を説明するのに役立つ同等の SQL ステートメントが含まれます。

このクエリは、filter型のorlink-entity型の子anyを使用して、コンタクトにあるレコードを返します。

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

このクエリでは、not any リンクの種類を使用して、名前列が と等しい取引先企業レコードの PrimaryContactId 参照列で参照されていないContosoテーブルから返します。 連絡先レコードは、取引先企業レコードが他のName列の値を持つ場合に、引き続き参照される可能性があります。

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

allnot allリンクの種類の意味は、名前が意味する場合とは逆であり、通常は逆フィルターで使用されます。

  • not all型のリンク エンティティは、anyと同等であり、フィルターに一致するリンク エンティティ レコードを持つ親レコードを返します。
  • all型のリンク エンティティは、一致するfrom列の値を持つリンク エンティティ レコードが存在するが、リンク エンティティ要素内で定義されている追加フィルターを満たすリンク エンティティ行がない場合に親レコードを返します。

このクエリでは、link-entity 型の not all を使用して、Contoso によって参照される contact テーブルのレコードを返します。この参照は、Name 列 と等しい少なくとも 1 つの 取引先企業 レコードによって行われます。

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

このクエリでは、link-entity型のallを使用して、PrimaryContactId 参照列によって参照される 連絡先 テーブルからレコードを返します。ただし、その中に名前列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>

条件の制限

FetchXML クエリには、最大 500 個の 条件リンク エンティティ 要素を含めることができます。 それ以外の場合は、次のエラー メッセージが表示されます。

名前: TooManyConditionsInQuery
コード: 0x8004430C
数: -2147204340
メッセージ: Number of conditions in query exceeded maximum limit.

クエリを実行する条件の数を減らす必要があります。 in 演算子 を使用して、数値、一意の識別子、文字列を最大 850 文字まで使用することで、条件の数を減らすことができます。

次のステップ

結果をページングする方法について説明します。