PreOperation RetrieveMultiple を使用したフィルター処理した場合に、すべての種類のクエリを実行する

カテゴリ: 設計、パフォーマンス、セキュリティ、サポート性

影響の可能性: 中程度

現象

別のアプリケーションからの RetrieveMultiple の呼び出しは異なる結果を表示します。

  • 例: レガシ アプリケーションの同じビューには、新しいアプリケーションでの異なる結果が表示されます。

ガイダンス

注意

Retrieve メッセージと RetrieveMultiple メッセージは 最もよく使用されるメッセージです。 これらのメッセージのプラグインは、システムのパフォーマンスが影響を受ける可能性があります。 通常、要件が他の方法でも達成することができる場合は、これらのメッセージのプラグインを使用しないようにする必要があります。 詳細: Retrieve メッセージと RetrieveMultiple メッセージ用のプラグインの登録を制限する

RetrieveMultiple メッセージに登録されたプラグインは、通常、エンティティのクエリで返された結果をフィルターするためのものです。 PostOperation ステージまたは PreOperation ステージのいずれかに登録されたプラグインを使用してこれをおこなう 2 つの戦略があります。

PostOperation フィルター処理

PostOperation ステージでは、OutputParametersBusinessEntityCollectionEntities プロパティから返されるレコードを評価し、返すべきではないエンティティを削除します。

この方法は、結果の各ページで返されるレコードの想定数を潜在的に変更し、データがアプリケーションで表示される際に一貫していないエクスペリエンスへとつながる可能性があります。

PostOperation フィルター処理

PreOperation ステージで、InputParameters Query プロパティを評価し、実行前に何が返されるかをフィルター処理するクエリを調整します。

この方法を使用する場合は、異なる種類のクエリに対して適切なフィルター処理を実行する必要があります。最も重要なクエリは FetchExpressionQueryExpressionです。 これらのうち一つのみを実行した場合は、その他の種類のクエリを使用する異なるアプリケーションには変更は適用されません。

QueryExpressionToFetchXml メッセージと FetchXmlToQueryExpression メッセージはある種類のクエリから他へと変換する機能がありますが、RetrieveMultiple 内にその他の呼び出しを含めることのパフォーマンスへの影響から、このコンテキストでこれらのメッセージを使用しないことをお勧めします。 むしろ、両方で同等のロジックを使用してフィルター処理を実行してください。

RetrieveMultiple: QueryByAttribute で使用できる 3 番目の種類のクエリもあります。 この種類のクエリは、複雑なフィルター処理はおこなわず、プラグイン内にさらに複雑なフィルター処理を行うロジックを含めることはできません。 幸い、このクエリは頻繁には使用されません。 加えるフィルター処理の必要性によって、InvalidPluginExecutionException をスローすることでこの種類のクエリを拒否することを選択することもできます。

推奨される戦略例については、サンプル: PreOperation ステージでクエリを変更する を参照してください。

問題となるパターン

FetchExpression または QueryExpression のいずれかのアプリケーションによって使用されているクエリの一つの種類のみを使用する、特定アプリケーションから返されるレコードを変更するようにプラグインが書かれている場合、結果がその他のアプリケーションで一貫しないことがある、またはアプリケーションが使用されているクエリの種類を変更する場合。 プラグインは、アプリケーションにかかわらず同じ結果を達成するように書かれている必要があります。

追加情報

Web API を使用する場合、クエリが あらかじめ定義されたクエリの取得と実行 で説明されている FetchXml を使用しない限り、コレクションでの GET 要求は、 QueryExpression に変換されます。 この場合の、クエリは FetchExpression を使用します。

モデル駆動型アプリの従来の Web クライアントは、統一インターフェイスに置き換えられました。 統一インターフェイスは、SavedQuery.FetchXml または UserQuery.FetchXml で定義された FetchXml を使用します。 より良いパフォーマンスを得るために、統一インターフェイスは、クエリをレガシ Web クライアントがおこなったようにこれらのクエリを実行する前に、FetchXml データを QueryExpression に変換しません。 したがって、QueryExpression を使用したレガシ Web クライアントのプラグイン コードで修正されたクエリは、プラグイン コードが同じロジックを FetchExpression クエリに対して適用するように書かれていない限り、ビューをサポートするクエリは、FetchExpression を使用して渡されているため、同じ変更には適用されません。

関連項目

サンプル: PreOperation ステージでクエリを変更する
組織サービスを使用したクエリ データ
FetchXML の使用によるクエリの作成
QueryExpression でクエリを作成する
retrieve および RetrieveMultiple メッセージ用のプラグインの登録を制限する
統一インターフェイスのコミュニティ

注意

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

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