次の方法で共有


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>

link-entity 要素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 ステートメントが含まれます。

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

<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 リンク タイプを使用して、Name 列が 「Contoso」 に等しいアカウント レコードの PrimaryContactId ルックアップ列によって参照されない連絡先テーブルのレコードを返します。 連絡先レコードは、取引先企業レコードが他の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列の値を持つリンク エンティティ レコードが存在するが、リンク エンティティ要素内で定義されている追加フィルターを満たすリンク エンティティ行がない場合に親レコードを返します。

このクエリは、not all 型 の link-entity を使用して、Name 列が「Contoso」に等しい、少なくとも 1 つのアカウント レコードのPrimaryContactId ルックアップ列によって参照されるレコードを 連絡先 テーブルから返します:

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

このクエリは、型が alllink-entity を使用して、連絡先 テーブルから、一部アカウント レコードの PrimaryContactId ルックアップ列 によって参照 される レコードを返します。ただし、これらの アカウント レコードのうち、Name 列 が '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 文字の条件数を減らすことができます。

次のステップ

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