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

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

影響の可能性: 中程度

現象

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

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

ガイダンス

注意

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

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

PostOperation フィルター処理

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

このアプローチでは、結果の各ページで返されるレコードの予想数が変わる可能性があり、データがアプリケーションで表示されるときに一貫性のないエクスペリエンスになる可能性があります。

PostOperation フィルター処理

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

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

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

RetrieveMultiple と併用できる 3 つ目のタイプのクエリがあります: QueryByAttribute. このタイプのクエリは複雑なフィルターを提供せず、プラグイン内でより複雑なフィルターロジックを含めることはできません。 幸いなことに、このタイプのクエリーは頻繁に使われるものではありません。 追加するフィルターの感度によっては、このタイプのクエリーを InvalidPluginExecutionException をスローして拒否することもできます。

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

問題となるパターン

特定のアプリケーションで、そのアプリケーションで使用される 1 種類のクエリ (FetchExpression または QueryExpression) だけを使用して返されるレコードを変更するプラグインを誰かが作成した場合、その結果は他のアプリケーションで一貫性がない可能性があります。 アプリケーションに関係なく同じ結果を提供するプラグインを記述します。

追加情報

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

統一インターフェイスは、モデル駆動型アプリケーションのレガシーな Web クライアントに取って代わりました。 統一インターフェイスは、SavedQuery.FetchXml または UserQuery.FetchXml で定義された FetchXml を使用します。 パフォーマンスを向上させるため、統一インターフェイスは、レガシーの Web クライアントが行っていたように、クエリを実行する前に FetchXml データを QueryExpression に変換しません。 そのため、QueryExpression を使用していたレガシー Web クライアント用のプラグイン コードで修正されたクエリは、FetchExpression のクエリに同じロジックを適用するようにプラグイン コードが記述されていない限り、FetchExpression を使用してビューをサポートするクエリが渡されるようになった現在、同じ変更は適用されません。

関連項目

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

注意

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

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