QueryExpression を使用して行をフィルターする

返されるデータ行の条件を設定するには、QueryExpression.Criteria または LinkEntity.LinkCriteria プロパティを FilterExpression クラス のインスタンスに設定します。

条件を設定するには、1 つ以上の ConditionExpression クラス インスタンスを FilterExpression.Conditions コレクション に追加します。

FilterExpression.FilterOperator プロパティ は、LogicalOperator 列挙型 値を使用して、条件の すべて (And) または いずれか (Or) を満たす必要があるかどうかを指定します。 既定値は And です。

FilterExpression.Filters プロパティ を使用して、And または Orを使用して組み合わせることができる追加のフィルター条件を追加します。

各条件について、ConditionExpression.Operator プロパティConditionOperator 列挙型 メンバーの 1 つに設定して、行の列の値を評価する方法を指定します。

たとえば、以下のクエリは address1_city が 「Redmond」 に等しいアカウント レコードを返します。 これは LogicalOperator.AndConditionOperator.Equal を使用します。

QueryExpression query = new("account")
{
   TopCount = 5,
   ColumnSet = new ColumnSet("name"),
   Criteria = new FilterExpression(LogicalOperator.And)
   {
      Conditions = {
         new ConditionExpression(
            attributeName:"address1_city",
            conditionOperator: ConditionOperator.Equal,
            value:"Redmond")
      }
   }
};

このクエリは address1_city が 「Redmond」、「Seattle」、または「Bellevue」 に等しいアカウント レコードを返します。 これは、それぞれが ConditionOperator.Equal を使用する ConditionExpression(String, String, ConditionOperator, Object) コンストラクター を使用して作成される 3 つの ConditionExpression インスタンスを乙 LogicalOperator.Or を使用します。

QueryExpression query = new("account")
{
   TopCount = 5,
   ColumnSet = new ColumnSet("name"),
   Criteria = new FilterExpression(LogicalOperator.Or)
   {
      Conditions = {
         new ConditionExpression(
            attributeName:"address1_city",
            conditionOperator: ConditionOperator.Equal,
            value:"Redmond"),
         new ConditionExpression(
            attributeName:"address1_city",
            conditionOperator: ConditionOperator.Equal,
            value:"Seattle"),
         new ConditionExpression(
            attributeName:"address1_city",
            conditionOperator: ConditionOperator.Equal,
            value:"Bellevue")
      }
   }
};

前のクエリは、単一の ConditionOperator.In を含む ConditionExpression を使用して表すこともできます。 この条件は、address1_city と比較する複数の値を設定する ConditionExpression(String, ConditionOperator, Object[]) コンストラクター を使用して作成されます。

QueryExpression query = new("account")
{
   TopCount = 5,
   ColumnSet = new ColumnSet("name"),
   Criteria = new FilterExpression(LogicalOperator.Or)
   {
      Conditions = {
         new ConditionExpression(
            attributeName:"address1_city",
            conditionOperator: ConditionOperator.In,
            values: new string[] { "Redmond", "Seattle", "Bellevue" })
      }
   }
};

演算子パラメーター

演算子には、パラメーターを必要としないもの、単一のパラメーターを必要とするもの、複数のパラメーターを必要とするものがあります。 演算子は、評価する値をどのように設定するかを決定します。

パラメーターがない

一部の演算子ではパラメータ値は必要ありません。

たとえば、ConditionExpression(String, ConditionOperator) コンストラクターConditionOperator.EqualUserId とともに使用して、一意の識別子を評価し、呼び出し元のユーザーの ID と一致するかどうかを判断できます。

new ConditionExpression(
   attributeName:"ownerid",
   conditionOperator: ConditionOperator.EqualUserId)

単体のパラメーター

演算子に 1 つのパラメーターが必要な場合は、ConditionExpression(String, ConditionOperator, Object) コンストラクター を使用して、評価する値の value パラメーターを指定します。

たとえば、ConditionOperator.Equal を使用して、レコードの statecode 選択列の値を評価できます。

new ConditionExpression(
    attributeName:"statecode",
    conditionOperator: ConditionOperator.Equal,
    value: 0)

複数のパラメーター

演算子に複数のパラメーターが必要な場合は、ConditionExpression(String, ConditionOperator, Object[]) コンストラクター values パラメーターを使用して、評価する値を指定します。

たとえば、ConditionOperator.Between を使用して数値を評価し、それが値のセットの範囲内にあるかどうかを判断できます。

new ConditionExpression(
    attributeName:"numberofemployees",
    conditionOperator: ConditionOperator.Between,
    values: new object[] {6,20})

LinkEntity のフィルター

LinkEntity.LinkCriteria プロパティ を使用してフィルターを適用する場合、QueryExpression.Criteria でフィルターを適用するように構成しない限り、結合とともにフィルターが適用されます。

LinkEntity.JoinOperator プロパティJoinOperator.LeftOuter を使用する場合、ConditionExpression.EntityName プロパティ 値を設定して、QueryExpression.Criteria でフィルターを適用する必要がある場合があります。 LinkEntity.EntityAlias プロパティ を使用している場合は、その値を使用して ConditionExpression.EntityName プロパティを設定します。 それ以外の場合は、ConditionExpression.EntityName プロパティを LinkEntity.LinkFromEntityName プロパティ 値に設定します。 セットに含まれないレコードの検索方法の詳細について

たとえば、次のクエリは、親会社なしの取引先担当者か、ファックス なしの親会社を返します。

QueryExpression query = new("contact") { 
     ColumnSet = new ColumnSet("fullname"),
     Criteria = new FilterExpression(LogicalOperator.And) { 
         Conditions = { 
            new ConditionExpression(){ 
                AttributeName = "fax",
                EntityName = "a",
                Operator = ConditionOperator.Null
            }
         }
     },
     LinkEntities = { 
        new LinkEntity(
            linkFromEntityName:"contact",
            linkToEntityName:"account",
            linkFromAttributeName:"parentcustomerid",
            linkToAttributeName:"accountid",
            joinOperator: JoinOperator.LeftOuter){
           EntityAlias = "a"
        }
    }
};

同じ行の列値に対するフィルター

ConditionExpression.CompareColumns プロパティ を、ConditionExpression(String, String, ConditionOperator, Boolean, Object) などのコンストラクターを使用して設定することで、同じ行の値で列を比較するフィルターを作成できます。これにより、compareColumns パラメーターを使用してこれを設定できるようになります。 CompareColumns が true の場合、値は他の列の名前を表します。

たとえば、列 firstname の値が列 lastname の値と一致する連絡先レコードを検索したい場合は、以下のクエリを使用します:

QueryExpression query = new("contact")
{
      ColumnSet = new ColumnSet("firstname"),
      Criteria = new FilterExpression(LogicalOperator.And)
      {
         Conditions = {
            new ConditionExpression(
                  attributeName:"firstname",
                  conditionOperator: ConditionOperator.Equal,
                  compareColumns: true, 
                  value: "lastname")
         }
      }
};

列比較フィルタの制限

この種のフィルターには制限があります:

  • 使用できるのは、次の ConditionOperator enum 演算子のみです。

    Operator プロパティ
    Equal 2 つの値は等しいです。
    NotEqual 2 つの値は等しくありません。
    GreaterThan 値が比較する値より大きい。
    GreaterEqual 値が比較値以上である必要があります。
    LessThan 値が比較する値より小さい。
    LessEqual 値が比較値以下である必要があります。
  • 一度に比較できるのは 2 つの列だけです

  • 拡張条件操作はサポートされていません。 例: value: "amount" + 100

  • 列は同じ型でなければなりません。 例: 文字列の値と数値の値を比較することはできません。

関連レコードの値を返さずにフィルター処理するには、LinkEntity.JoinOperator が次のいずれかの JoinOperator 列挙型メンバーを使用する LinkEntity インスタンスで、LinkEntity.JoinOperator が次の JoinOperator enum メンバーの一つを使用する FilterExpression.AnyAllFilterLinkEntity プロパティを LinkEntity インスタンスを使用します。

件名 プロパティ
Any 結果を、リンクされたエンティティ内の一致する行を持つ親行に制限します。
NotAny リンクされたエンティティに一致する行がない親行に結果を制限します。
All from 列の値が一致する行がリンク エンティティに存在するが、それらの一致する行のすべてがこのリンク エンティティに定義された追加フィルタを満たさない場合に、結果を親行に制限します。 追加フィルタを反転して、一致するリンク エンティティ行がすべて追加条件を満たす親行を見つける必要があります。
NotAll 結果を、リンクされたエンティティ内の一致する行を持つ親行に制限します。 このリンク タイプは、名前を問わず、any と同等です。

これらの JoinOperator メンバー値を LinkEntity で指定された FilterExpression.AnyAllFilterLinkEntity とともに使用する場合、これらのフィルターは、FilterExpression.FilterOperator (And/Or) で定義された動作に従う子条件になります。

これらの JoinOperator メンバー値を使用するフィルターは、LinkEntity 内に一致する行が複数存在する場合でも、親行を最大 1 回返します。 LinkEntity.Columns プロパティ で指定された列はすべて無視されます。

次の例は、関連レコードの値に対するフィルターを示しています。 これらの例には、動作の説明に役立つ同等の SQL 文が含まれています。

または JoinOperator.Any でフィルターします

このクエリでは、 が LogicalOperator.Or に設定された FilterOperator プロパティ、そして AnyAllFilterLinkEntity プロパティが JoinOperator プロパティが JoinOperator.Any に設定されている LinkEntity と設定されている FilterExpression を使用します。 このクエリは次の どちらか である コンタクト レコードを返します:

var query = new QueryExpression("contact")
{
    ColumnSet = new ColumnSet("fullname"),
    Criteria = new FilterExpression(filterOperator: LogicalOperator.Or)
    {
        AnyAllFilterLinkEntity = new LinkEntity(
            linkFromEntityName: "contact",
            linkToEntityName: "account",
            linkFromAttributeName: "contactid",
            linkToAttributeName: "primarycontactid",
            joinOperator: JoinOperator.Any)
        {
            LinkCriteria = new FilterExpression(filterOperator: LogicalOperator.And)
            {
                Conditions = {
                    new ConditionExpression(
                        attributeName: "name",
                        conditionOperator: ConditionOperator.Equal,
                        value: "Contoso")
                }
            }
        },
        Conditions = {
            new ConditionExpression(
                attributeName:"statecode",
                conditionOperator: ConditionOperator.Equal,
                value: 1)
        }
    }
};

JoinOperator.NotAny

このクエリは、JoinOperator.NotAny を使用して 名前列 が 'Contoso' に等しい 取引先企業 レコードの PrimaryContactId ルックアップ列 によって参照されて いない 連絡先 テーブルからレコードを返します。 取引先担当者レコードは、 他の name 列値を持つアカウント レコードによって引き続き参照される可能性があります。

var query = new QueryExpression("contact")
{
      ColumnSet = new ColumnSet("fullname"),
      Criteria = new FilterExpression(filterOperator: LogicalOperator.And)
      {
         AnyAllFilterLinkEntity = new LinkEntity(
            linkFromEntityName: "contact",
            linkToEntityName: "account",
            linkFromAttributeName: "contactid",
            linkToAttributeName: "primarycontactid",
            joinOperator: JoinOperator.NotAny)
         {
            LinkCriteria = new FilterExpression(filterOperator: LogicalOperator.And)
            {
                  Conditions = {
                     new ConditionExpression(
                        attributeName: "name",
                        conditionOperator: ConditionOperator.Equal,
                        value: "Contoso")
                  }
            }
         }
      }
};

JoinOperator.NotAll

注意

JoinOperator.AllJoinOperator.NotAll の意味は名前が示すものとは逆であり、通常は反転フィルターで使用されます。

  • JoinOperator.NotAllJoinOperator.Any と同等であり、フィルターに一致する関連テーブル レコードを持つ親レコードを返します。
  • JoinOperator.All は、一致する LinkFromAttributeName 列値を持つ関連エンティティ レコードが存在するが、それらのリンク エンティティ行の いずれもLinkEntity 内で定義された追加フィルターを満たしていない場合に、親レコードを返します。

このクエリは、JoinOperator.NotAll を使用して 名前列 が 'Contoso' に等しい少なくとも一つの 取引先企業 レコードの PrimaryContactId ルックアップ列 によって参照されて いない 連絡先 テーブルからレコードを返します。

var query = new QueryExpression("contact")
{
    ColumnSet = new ColumnSet("fullname"),
    Criteria = new FilterExpression(filterOperator: LogicalOperator.And)
    {
        AnyAllFilterLinkEntity = new LinkEntity(
            linkFromEntityName: "contact",
            linkToEntityName: "account",
            linkFromAttributeName: "contactid",
            linkToAttributeName: "primarycontactid",
            joinOperator: JoinOperator.NotAll)
        {
            LinkCriteria = new FilterExpression(filterOperator: LogicalOperator.And)
            {
                Conditions = {
                    new ConditionExpression(
                        attributeName: "name",
                        conditionOperator: ConditionOperator.Equal,
                        value: "Contoso")
                }
            }
        }
    }
};

JoinOperator.All

このクエリは、are referenced by theof 一部の 取引先企業 レコードの PrimaryContactId ルックアップ列 によって参照 された 取引先担当者 テーブルからのレコードを返すために JoinOperator.All を使用しますが、これら 取引先企業 レコードは いずれも 'Contoso' に等しい 名前列 を持っていません。

var query = new QueryExpression("contact")
{
    ColumnSet = new ColumnSet("fullname"),
    Criteria = new FilterExpression(filterOperator: LogicalOperator.And)
    {
        AnyAllFilterLinkEntity = new LinkEntity(
            linkFromEntityName: "contact",
            linkToEntityName: "account",
            linkFromAttributeName: "contactid",
            linkToAttributeName: "primarycontactid",
            joinOperator: JoinOperator.All)
        {
            LinkCriteria = new FilterExpression(filterOperator: LogicalOperator.And)
            {
                Conditions = {
                    new ConditionExpression(
                        attributeName: "name",
                        conditionOperator: ConditionOperator.Equal,
                        value: "Contoso")
                }
            }
        }
    }
};

条件の制限

クエリに含めることができる ConditionExpression および LinkEntity インスタンスの合計は 500 個までです。 それ以外の場合はこのエラーが表示されます:

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

クエリを実行するための条件数を減らす必要があります。 数値、一意の識別子、および最大 850 文字の文字列で使用できる ConditionOperator.In を使用すると、条件の数を減らすことができる場合があります。

次の手順

結果を表示する方法をご覧ください。

注意

ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)

この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。