Freigeben über


Implementierung aller Arten von Abfragen bei der Ergebnisfilterung mit PreOperation RetrieveMultiple

Kategorie: Entwurf, Leistung, Sicherheit, Unterstützbarkeit

Wirkungspotential: Mittel

Symptome

RetrieveMultiple-Aufrufe aus verschiedenen Anwendungen zeigen unterschiedliche Ergebnisse an.

  • Zum Beispiel: Dieselben Ansichten in Legacy-Anwendungen zeigen unterschiedliche Ergebnisse in neuen Anwendungen.

Anleitung

Hinweis

Die Retrieve und RetrieveMultiple Nachrichten sind in der Regel die am häufigsten verwendeten Nachrichten. Plug-Ins für diese Nachrichten können die Systemleistung erheblich beeinträchtigen. Generell sollten Sie die Verwendung von Plugins für diese Nachrichten vermeiden, wenn die Anforderungen auf andere Weise erreicht werden können. Mehr Informationen: Beschränken Sie die Registrierung von Plugins für Retrieve and RetrieveMultiple Nachrichten.

Plugins, die in der RetrieveMultiple-Meldung registriert sind, sind typischerweise dazu gedacht, die Ergebnisse von Abfragen nach einer Entität zu filtern. Es gibt zwei Strategien, dies mit einem Plug-in zu tun, das entweder auf der Stufe PostOperation oder PreOperation registriert ist.

PostOperation-Filterung

Werten Sie in der Phase PostOperation die in der Eigenschaft OutputParameters BusinessEntityCollection Entities zurückgegebenen Datensätze aus und entfernen Sie Entitäten, die nicht zurückgegeben werden sollen.

Dieser Ansatz ändert möglicherweise die erwartete Anzahl der Datensätze, die auf jeder Seite der Ergebnisse zurückgegeben werden, und kann zu inkonsistenten Erfahrungen führen, wenn die Daten in einer Anwendung angezeigt werden.

PreOperation-Filterung

Werten Sie im Schritt PreOperation die Eigenschaft InputParameters Query aus und passen Sie die Abfrage an, um zu filtern, was vor der Ausführung zurückgegeben wird.

Bei der Verwendung dieses Ansatzes müssen Sie vor allem für die verschiedenen möglichen Arten von Abfragen die entsprechende Filterung implementieren: FetchExpression und QueryExpression. Wenn Sie nur eine dieser Optionen implementieren, werden Ihre Änderungen nicht von verschiedenen Anwendungen übernommen, die die andere Art von Abfrage verwenden.

Obwohl die Nachrichten QueryExpressionToFetchXml und FetchXmlToQueryExpression die Möglichkeit bieten, einen Abfragetyp in einen anderen umzuwandeln, empfehlen wir Ihnen, diese Nachrichten in diesem Zusammenhang nicht zu verwenden, da sie die Performance beeinträchtigen, wenn Sie mehr Aufrufe in RetrieveMultiple aufnehmen. Implementieren Sie vielmehr Ihre Filterung mit der entsprechenden Logik in beiden.

Es gibt eine dritte Art von Abfrage, die auch mit RetrieveMultiple verwendet werden kann: QueryByAttribute. Dieser Typ der Abfrage sieht keine komplexe Filterung vor und es ist nicht möglich, komplexere Filterlogik in ein Plug-In einzubinden. Glücklicherweise wird dieser Typ der Abfrage nicht häufig verwendet. Abhängig von der Empfindlichkeit der von Ihnen hinzugefügten Filterung können Sie Anfragen dieses Typs ablehnen, indem Sie eine InvalidPluginExecutionException auslösen.

Beispiel

Siehe Muster: Ändern Sie die Abfrage in der Phase PreOperation für ein Beispiel für die von uns empfohlene Strategie.

Problematische Muster

Wenn jemand ein Plug-in schreibt wird, um die Datensätze zu ändern, die in einer bestimmten Anwendung zurückgegeben werden, die nur eine Art von Abfrage verwendet, entweder FetchExpression oder QueryExpression, sind die Ergebnisse in anderen Anwendungen möglicherweise nicht konsistent oder wenn die Anwendung die Art der verwendeten Abfrage ändert. Schreiben Sie Plug-Ins, die unabhängig von der Anwendung das gleiche Ergebnis liefern.

Weitere Informationen

Bei Verwendung der Web API werden GET-Requests auf eine Collection in QueryExpression konvertiert, es sei denn, die Abfrage verwendet FetchXml wie unter Abrufen und Ausführen vordefinierter Abfragen beschrieben. In diesem Fall verwenden die Abfragen FetchExpression.

Die einheitliche Oberfläche hat den Legacy-Webclient für modellgesteuerte Apps ersetzt. Die einheitliche Benutzeroberfläche verwendet die in den Eigenschaften SavedQuery.FetchXml oder UserQuery.FetchXml definierte FetchXml. Um die Leistung zu verbessern, konvertiert das einheitliche Benutzeroberfläche die FetchXml-Daten nicht in eine QueryExpression, bevor diese Abfragen wie der Legacy-Webclient ausgeführt werden. Daher werden Abfragen, die im Plug-In-Code für den älteren Web-Client, der QueryExpression verwendet hat, geändert wurden, nicht die gleichen Änderungen anwenden, da die Abfrage zur Unterstützung von Views mit FetchExpression übergeben wird, es sei denn, der Plug-In-Code wird geschrieben, um dieselbe Logik auf FetchExpression-Abfragen anzuwenden.

Siehe auch

Beispiel: Ändern Sie die Abfrage in der Vorbereitungsphase
Daten mithilfe des SDK für .NET abfragen
Daten mithilfe von FetchXml abfragen
Erstellen von Abfragen mit QueryExpression
Einschränkung der Registrierung von Plugins für Retrieve- und RetrieveMultiple-Nachrichten
Community für die einheitliche Benutzeroberfläche

Hinweis

Können Sie uns Ihre Präferenzen für die Dokumentationssprache mitteilen? Nehmen Sie an einer kurzen Umfrage teil. (Beachten Sie, dass diese Umfrage auf Englisch ist.)

Die Umfrage dauert etwa sieben Minuten. Es werden keine personenbezogenen Daten erhoben. (Datenschutzbestimmungen).