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.And
と ConditionOperator.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
を使用します。 このクエリは次の どちらか である コンタクト レコードを返します:
- PrimaryContactId ルックアップ列 の少なくとも ’Contoso’ に等しい名前欄 アカウント 記録の一つによって参照されています
- または
- Contact.StateCode 列 を 1 : 非アクティブ に設定します:
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.All
と JoinOperator.NotAll
の意味は名前が示すものとは逆であり、通常は反転フィルターで使用されます。
JoinOperator.NotAll
はJoinOperator.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 分かかります。 個人データは収集されません (プライバシー ステートメント)。