FetchXML Abfragegenerator

<FetchXmlBuilder> bearbeitet eine FetchXML-Abfrage, ohne dass jemand FetchXML schreibt. Es deckt die Teile der Sprache ab, auf die die Menschen tatsächlich zugreifen – die Tabelle, die zurückgegebenen Spalten, wie die Zeilen sortiert sind, und einen Filterbaum mit Bedingungen und verschachtelten Gruppen – und fügt zugehörige Tabellen hinzu, Aggregate und führt das aus, was es gebaut hat.

Probier es mal

Die eigentliche Komponente im Vergleich zu den Metadaten dieser Umgebung. Wähle eine Tabelle, füge eine Spalte oder eine Bedingung hinzu, joine eine zugehörige Tabelle und beobachte, wie das FetchXML-Panel Schritt hält – dann drücke Ausführen, um zu sehen, was die Abfrage übereinstimmt.

React-Beispiel Blazor-Beispiel React TypeScript Razor
Abfrage Optionen FetchXML
Tabelle
Account (account)Contact (contact)Opportunity (opportunity) Die Tabelle, aus der die Abfrage liest. Eine Änderung löscht die Spalten und die Sortierreihenfolge, die Namensspalten, die die neue Tabelle nicht hat.
Säulen
Gibt Summen und Zählungen über Zeilen zurück, statt über die Zeilen selbst. Jede Spalte muss dann angeben, was sie beiträgt – einen Wert, der über die Zeilen oder das Objekt berechnet wird, nach dem sie gruppiert sind – und muss benannt werden, weil ein Aggregat keinen eigenen Spaltennamen hat. Eine Aggregate-Abfrage liest höchstens 50.000 Zeilen und scheitert darüber hinaus. Kolumnen bearbeiten
Email (emailaddress1) Der Name, unter dem diese Spalte zurückkommt. Bleibt sie leer, erscheint sie wieder unter einem eigenen Namen, der mit dem Alias der zugehörigen Tabelle vorangestellt wird, wenn es sich um eine zusammengekoppelte Spalte handelt. Spalte entfernen
Full Name (fullname) Der Name, unter dem diese Spalte zurückkommt. Bleibt sie leer, erscheint sie wieder unter einem eigenen Namen, der mit dem Alias der zugehörigen Tabelle vorangestellt wird, wenn es sich um eine zusammengekoppelte Spalte handelt. Spalte entfernen
Sortieren
Edit-Sorts
Full Name (fullname) AufstiegAbsteigend Vorrücken Geh nach unten Sortieren entfernen
Filter
Beginnen Sie aus einer Ansicht Filter hinzufügen Hinzufügen der zugehörigen Einheit
Keine Filter – jede Zeile wird zurückgegeben.
Maximale Anzahl von Reihen zum Zurücksenden. Lass das Feld leer, ohne Begrenzung. Fragt Dataverse, wie viele Zeilen übereinstimmen, zusammen mit der zurückgegebenen Seite – was ein Pager benötigt, um eine Gesamtzahl anzuzeigen. Die Zählung endet bei 5.000: Ab diesem Zeitpunkt meldet die Antwort, dass das Limit überschritten wurde, statt wie viele es sind. Zerlegt die Abfrage in Teile und setzt die Ergebnisse wieder zusammen. Es lohnt sich, eine Abfrage mit vielen Joins oder vielen Nachschlage- und berechneten Spalten auszuprobieren – das kann eine einfache Abfrage langsamer machen. An SQL Server übergeben. Wenden Sie diese nur an, wenn der Microsoft-Support einen empfiehlt: Der falsche Hinweis kann die Leistung einer Abfrage erheblich beeinträchtigen.
Füge das FetchXML hier ein oder bearbeite es. Es wird einen Moment nach dem Tippen gelesen, und der obige Editor baut sich daraus neu zusammen.
Ergebnisse
Abfrage ausführen

Nicht dasselbe wie FetchXMLBuilder

Diese Seite handelt von der Komponente. FetchXMLBuilder ist die C#-Klasse, die dasselbe XML im Code zusammensetzt, für einen serverseitigen Aufrufer, der eine Abfrage manuell erstellt. Sie erzeugen das Gleiche und keiner benötigt den anderen.

Metadaten sind erforderlich, nicht optional

Jede Tabelle, Spalte und Beziehung wird aus dem ausgewählt, was die Umgebung tatsächlich hat. Das ist beabsichtigt: Ein logischer Name, der von Hand getippt wird, erzeugt FetchXML, das perfekt analysiert wird und dann gegen Dataverse fehlschlägt, was die schlimmste Art von Fehler ist, die man jemandem geben kann. Der usePowerPortalsProFetchXmlMetadata Haken verbindet den Builder mit den zwischengespeicherten Metadaten-Endpunkten des Frameworks, sodass die Picker alles teilen, was die Raster auf derselben Seite bereits abgerufen haben.

Blazor benötigt keine Verdrahtung: <FetchXmlBuilder> Es löst den Metadatendienst des Portals selbst auf und liest dieselben zwischengespeicherten Endpunkte, sodass seine Picker auch das teilen, was die Raster auf der Seite bereits abgerufen haben.

Die Abfrage-Roundtrips

Der Builder parst FetchXML in ein Dokumentmodell und schreibt es wieder heraus. Alles, wofür er keinen Editor hat – ein Attribut einer neueren Plattformversion, ein von einem anderen Tool geschriebenes Element – wird unberührt durchgetragen, anstatt beim Laden fallen zu lassen, sodass das Öffnen einer Abfrage im Editor und das Speichern eines Abschnitts nie einen Teil davon kostet.

Was das für eine gespeicherte Abfrage bedeutet

Die Formatierung bleibt nicht erhalten. Einzug und Attributquotierung werden beim Herausgehen normalisiert, sodass eine im Builder erneut gespeicherte Abfrage dieselbe Anfrage ist und nicht derselbe Text.

Bereitstellung einer Anfrage

Es gibt drei Zugänge, und alle drei laufen über denselben Leser:

  • Die Propeller value . Liefern Sie sie onChange für eine kontrollierte Komponente oder verwenden defaultValue Sie sie und lassen Sie den Bauherren über ihren Zustand verfügen.
  • Das GetchXML-Panel. Füge eine Abfrage ein oder tippe sie ein, und der Editor baut sich etwa eine Sekunde nach dem Tippen wieder auf.
  • Eine gespeicherte Ansicht. Starte mit einer Ansicht im Filter-Header, listet die Ansichten der Tabelle auf und übernimmt die gesamte Abfrage von der gewählten Ansicht. Es ist eine Kopie – nichts wird zurück in die Ansicht geschrieben.

Was auch immer eintrifft, wird zuerst überprüft. Fehlgeformtes XML wird mit Zeile und Spalte gemeldet, ebenso alles, was den Editor dazu bringen würde, etwas anderes anzuzeigen als das, was geschrieben wurde – einen Operator oder Linktyp, den er nicht kennt, eine Abfrage, die keine Tabelle nennt. Diese werden komplett abgelehnt und die bereits auf dem Bildschirm befindliche Abfrage bleibt unverändert. Alles andere wird gemeldet und weiterhin angewendet: ein falsch geschriebenes Element oder Attribut, zwei Tabellen mit gemeinsamem Alias, eine Bedingung, die von einem Alias liest, nichts deklariert.

Verwandte Tabellen

Ein Join wird vom Beziehungspicker hinzugefügt, sodass die from Spalten und to aus der Beziehung stammen und nicht aus dem Speicher. Was ein Join dann beitragen kann, hängt von seinem Typ ab:

  • Zurückgebende Typen — inner, und matchfirstrowusingcrossapply outer — bringen die Spalten der zugehörigen Tabelle zurück, sodass ihre Spalten projiziert, sortiert und verglichen werden können.
  • Filtertypen — exists, , inany, und not any all — geben die Zeile höchstens einmal zurück und keine der zugehörigen Spalten. Der Editor lässt den Alias fallen, wenn man zu einem Alias, sodass der Name für einen weiteren Beitritt frei ist.
  • Hat keine zugehörige Zeile und ist ein Preset statt eines Linktyps: FetchXML hat keine dafür, daher schreibt der Editor den äußeren Join und den Null-Test auf dem von der Plattform erwarteten joined-Schlüssel und hält beide Schritt beieinander.

Über "alle"

FetchXML bedeutet nicht das, was sein Name vermuten lässt – es ordnet Zeilen ab, die verwandte Zeilen all haben , von denen keine den Filter erfüllt, und not all wird als äquivalent zu anydokumentiert. Jeder Typ wird nach seiner Funktion und nicht nach seinem Namen beschriftet, und eine Invert conditions-Aktion in einer Filtergruppe drückt die Lesung aus, die die Leute normalerweise wollen.

Arbeit mit dem Filterbaum

Ein Filter ist eine Gruppe von Bedingungen, kombiniert mit und/ oder oder, und Gruppen verschachtelt sich in der Tiefe, die die Abfrage benötigt. Vier Dinge im Baum sind es wert, darüber zu wissen, denn jede beantwortet eine Frage, die FetchXML unangenehm macht:

  • Invert ersetzt jede Bedingung in einer Gruppe durch ihr Gegenteil und tauscht und für oder. Es existiert für einen Linktyp: all bedeutet nicht "jede verwandte Zeile stimmt überein" – es stimmt Zeilen ab, deren verwandte Zeilen den Filter nicht erfüllen – daher bedeutet das Ausdrücken der intuitiven Lesart das Invertieren zuerst. Es wird nur angeboten, wenn jede Bedingung unten ein echtes Gegenteil hat; die meisten Datumsoperatoren haben keine, und das Invertieren eines Filters würde invertiert aussehen und die falschen Zeilen übereinstimmen.
  • Vergleiche mit einer Spalte testet eine Spalte gegen eine andere statt mit einem Wert – FetchXML . Sechs Operatoren valueoferlauben dies und die Plattform lehnt den Rest komplett ab, sodass die Operatorenliste sich verengt, während die Zeile in diesem Modus ist. Kandidaten stammen aus jeder joined-Tabelle, da eine Bedingung eine verwandte Spalte erreicht, indem sie das Join-Alias benennen.
  • Union hint führt eine OR-Gruppe als Vereinigung separater Abfragen aus, statt einer einzigen Abfrage mit einem OR über Tabellen hinweg – eine Form, die SQL nicht gut indexieren kann. Es lohnt sich, wenn die Bedingungen in der Gruppe Spalten in verschiedenen verwandten Tabellen testen. Eine Abfrage kann nur eine haben.
  • Start von einer Ansicht und kopiere die Abfrage einer gespeicherten Ansicht in den Editor – deren Tabelle, Spalten, Sortierungen und Bedingungen. Nichts wird direkt in die Ansicht zurückgeschrieben.

Reihen, die noch nicht fertig sind

Eine Bedingung, der den Wert fehlt, den sein Operator benötigt, wird umrissen, ebenso wie ein Alias, das erforderlich und leer ist oder mit einer anderen Spalte geteilt wird. Alle drei erzeugen FetchXML, das perfekt parsiert und dann fehlschlägt – oder still die falschen Zeilen zurückgibt –, sodass der Editor dies sagt, anstatt es beim Ausführen der Abfrage finden zu lassen. Operatoren, die keinen Wert benötigen, wie Contains data und Today, sind für sich allein vollständig und werden nie markiert.

Aggregierte Abfragen

Schalten Sie im Abschnitt Spalten Aggregate ein, und jede Spalte gibt an, was sie beiträgt – ein Wert, der über die Zeilen berechnet wird, oder das Element, nach dem sie gruppiert sind. Die angebotenen Funktionen verengen sich auf den Typ der Spalte, Aliase werden benötigt und werden für Sie ausgefüllt, eine gruppierte Datumsspalte erhält einen Datumsteil, und das Sortieren wechselt zu den Aliasen, weil die Zeilen einer aggregierten Abfrage Gruppen und berechnete Werte ohne Spalten zum Sortieren sind.

allowAggregate={false} zieht den Switch zurück, für einen Host, der Zeilen statt Totalen liest – eine Regel, die jeweils einen Datensatz bewertet, ein gespeicherter Filter, überall dort, wo eine einzelne Zeile berechneter Werte aussieht, wäre keine Antwort. Sie ist abwesend und nicht deaktiviert, da keine Änderung der Abfrage sie zurückbringen würde. Die eine Ausnahme ist eine Abfrage, die bereits aggregiert: Sie behält ihre Kontrollen, wie auch immer der Prop gesetzt ist, sodass eine, die in das FetchXML-Panel eingefügt wurde, weiterhin in eine gewöhnliche Abfrage zurückbearbeitet werden kann.

AllowAggregate="false" das Gleiche auf Blazor, mit derselben Ausnahme: Eine Abfrage, die bereits aggregiert, behält ihre Steuerungen, sodass eine, die in den FetchXML-Tab eingefügt wurde, weiterhin in eine gewöhnliche Abfrage zurückbearbeitet werden kann.

Montage eines Teils davon

Jeder Abschnitt kann ausgeschaltet werden, und die Abschnitte werden einzeln exportiert für ein Layout, das sie woanders benötigt – mounten <FetchXmlBuilderProvider> und platzieren Sie die FetchXml*Section Komponenten selbst. Das Weglassen eines Abschnitts entfernt dessen Benutzeroberfläche, niemals das zugrundeliegende FetchXML: Die Spalten einer Abfrage überleben unberührt mit columns: false.

Blazor verwendet denselben Satz wie ein Sections Datensatz, und die Abschnitte sind eigenständige Komponenten – Kaskaden-a FetchXmlBuilderState und Platzierung der FetchXml*Section Komponenten dort, wo ein Layout sie braucht. Das Ausstecken eines entfernt den Editor und nie die dahinterliegende Abfrage.

Einschränkung der Tabellen

allowedTables schränkt den Tabellenwähler auf die logischen Namen ein, die du auflistest – für eine Oberfläche, die keine Aufgabe hat, die gesamte Umgebung abzufragen, wie ein Report Builder über die wenigen Tabellen, die ein Portal offenstellt. Lässt man es weg, wird jede Tabelle angeboten. Es schränkt ein, was ausgewählt werden kann, nicht was gezeigt werden kann: Eine Abfrage, die bereits eine Tabelle außerhalb der Liste nennt, behält sie, anstatt still umgeschrieben zu werden, und eine verwandte Tabelle wird immer noch nach ihrem Anzeigenamen benannt, wo ein Join sie erwähnt. Joins selbst sind nicht eingeschränkt, da sie Beziehungen folgen – eine Eigenschaft der bereits gewählten Tabelle.

AllowedTables ist das Blazor-Äquivalent und schränkt ein, was gewählt werden kann, statt das, was auf genau dieselbe Weise gezeigt werden kann.

Ausführung der Abfrage

Liefert renderResults und der Builder erstellt ein Ergebnispanel mit einem Ausführen-Button und entscheidet, wann es gedrückt werden darf: sobald die Abfrage eine Tabelle und ihre Spalten benannt hat und kein Feld rot markiert ist. Das Anzeigen von Zeilen erfordert einen Datenclient, von dem der Builder absichtlich keinen hat, sodass ein Ergebnis Ihres Aussehens ist – auf einem Portal bedeutet das meist das eigene <MainGrid> Framework über die zurückgegebene Abfrage. Lassen Sie den Prop aus, und das Panel ist nicht mehr vorhanden.

Bei Blazor erscheint dasselbe Panel, sobald ein RenderResults Fragment bereitgestellt wurde, und die ausführbare Abfrage, die es zurückgibt, enthält die Tabelle, FetchXML und die Namen, unter denen die Spalten zurückkommen. Lässt man das Fragment weg, gibt es kein Panel.

API

Reagieren Blazor

FetchXmlBuilder Baureihe

Parameter

Name
Typ
Default
Beschreibung
AllowAggregatebool
True
Ob die Anfrage aggregiert werden könnte. Verbirgt das Angebot, wenn es nicht sein könnte.
AllowedTablesIReadOnlyList<string>?
Die einzigen Tische, die der Plücker anbietet, oder für alle nichts.
FetchXmlstring?
Die Anfrage wird bearbeitet.
ReadOnlybool
False
Zeigt die Abfrage an, ohne anzubieten, sie zu ändern.
RenderResultsRenderFragment<FetchXmlRunnableQuery>?
Zeichnet die Zeilen, die die Abfrage zurückgegeben hat, was auch den Ergebnisbereich hinzufügt.
SectionsFetchXmlBuilderSections
Welche Abschnitte gezeigt werden sollen. Alles außer den Ergebnissen, die irgendwo zu sehen sind.
ShowLogicalNamesbool
True
Ob Tabellen und Spalten mit ihren logischen Namen neben ihren Anzeigenamen benannt werden – Kontoname (Name) – und Joins zeigen die Aliasnamen, unter denen ihre Spalten zurückkommen. Weiter von Standard; setze es auf falsch für Nutzer, die die Daten allein über ihre Anzeigenamen kennen, auf die logischen Namen bedeuten nichts.
Tablestring?
Heftet die Abfrage an eine Tabelle, sodass der Tabellenwähler angezeigt, aber deaktiviert ist.
Name: AllowAggregate
Typ: bool
Default: True
Beschreibung: Ob die Anfrage aggregiert werden könnte. Verbirgt das Angebot, wenn es nicht sein könnte.
Name: AllowedTables
Typ: IReadOnlyList<string>?
Beschreibung: Die einzigen Tische, die der Plücker anbietet, oder für alle nichts.
Name: FetchXml
Typ: string?
Beschreibung: Die Anfrage wird bearbeitet.
Name: ReadOnly
Typ: bool
Default: False
Beschreibung: Zeigt die Abfrage an, ohne anzubieten, sie zu ändern.
Name: RenderResults
Typ: RenderFragment<FetchXmlRunnableQuery>?
Beschreibung: Zeichnet die Zeilen, die die Abfrage zurückgegeben hat, was auch den Ergebnisbereich hinzufügt.
Name: Sections
Typ: FetchXmlBuilderSections
Beschreibung: Welche Abschnitte gezeigt werden sollen. Alles außer den Ergebnissen, die irgendwo zu sehen sind.
Name: ShowLogicalNames
Typ: bool
Default: True
Beschreibung: Ob Tabellen und Spalten mit ihren logischen Namen neben ihren Anzeigenamen benannt werden – Kontoname (Name) – und Joins zeigen die Aliasnamen, unter denen ihre Spalten zurückkommen. Weiter von Standard; setze es auf falsch für Nutzer, die die Daten allein über ihre Anzeigenamen kennen, auf die logischen Namen bedeuten nichts.
Name: Table
Typ: string?
Beschreibung: Heftet die Abfrage an eine Tabelle, sodass der Tabellenwähler angezeigt, aber deaktiviert ist.

Veranstaltungen

Name
Typ
Beschreibung
FetchXmlChangedEventCallback<string>
Es wird angezeigt, wann immer eine Änderung die Abfrage ändert.
Name: FetchXmlChanged
Typ: EventCallback<string>
Beschreibung: Es wird angezeigt, wann immer eine Änderung die Abfrage ändert.