Dela via


Universal FetchXML för att utöka Universal Resource Scheduling

Universal FetchXML (UFX) är ett avancerat frågespråk som gör att du kan fråga efter data med hjälp av dynamisk FetchXML, shape och förbereda resulterande data för användning av URS-lösningen (Universal Resource Scheduling). Med det här frågespråket kan du skapa anpassade frågor för att anpassa och utöka schemaläggningstavlan och schemaläggningsassistentens filter för att uppfylla organisationens unika affärsbehov.

UFX består av två komponenter: UFX, väska och UFX-fråga.

Enkel UFX-väska

En UFX-påse innehåller data som är statiskt typade. I minnet modellerar den en ordlista med nycklar och värden. Den kan serialiseras till JSON och XML. Om du har angett data kan en UFX-fråga fråga efter data från den och klientgränssnittet binda till den.

Av praktiska skäl och prestandaskäl implementeras den minnesinterna påsen ovanpå SDK-objektet Entity för Dynamics 365-appar.

Provpåse som innehåller två värden.

I minnet:

nyckel värde typ
namn John snöre
ålder 36 Int

I JSON:

{
    "name": "John",
    "age": 36
}

I XML:

<bag>
    <name ufx-type="string">John</name>
    <age ufx-type="int">36</age>
</bag>

Typer som stöds av UFX

En UFX-påse kan innehålla många olika värden. De kategoriseras i tre typklasser:

Kategori Värde
Enkla typer bool (Boolean), int (Int32), long (Int64), double (Double), decimal (Decimal), , datetime (DateTime), , guid (Guid)string (String)
Dynamics 365-specifika enkla typer: money (Money), option (OptionSet), lookup (EntityReference)
Andra väskor bag (Entity)
Lista över väskor list (EntityCollection)

Här är ett exempel på en JSON-påse som innehåller fler typer:

{
    "citizen": true,          // implicit bool
    
    "age": 36,                // explicit int
    "age@ufx-type": "int",

    "name": {                 // nested bag
        "first": "John",
        "last": "Doe"
    },

    "children": [             // list of bags
        { "name": "Sam" },
        { "name": "Judy" }
    ]
}

Samma påse i XML:

<bag>
    <citizen ufx-type="bool">true</citizen>

    <age ufx-type="int">36</age>

    <name ufx-type="bag">
        <first ufx-type="string">John</first>
        <last ufx-type="string">Doe</last>
    </name>

    <children ufx-type="list">
        <bag>
            <name ufx-type="string">Sam</name>
        </bag>
        <bag>
            <name ufx-type="string">Judy</name>
        </bag>
    </children>
</bag>

UFX-frågor

UFX-frågor skrivs som XML-baserade UFX-påsar. Egenskaper i påsen kan innehålla UFX-direktiv för att fråga efter data dynamiskt. En UFX-fråga körs på minnesinterna objekt, inte XML. Endast direktiven är skrivna i XML. Dess utdata kan serialiseras till JSON eller XML.

Följande UFX-fråga definierar egenskapen i påsen accounts med source UFX-direktivet. Det innebär att Dynamics 365 kör den infogade FetchXML och fyller i accounts egenskapen med en lista med påsar. En EntityCollection där varje påse representerar en enskild kontopost från Dynamics 365.

<bag xmlns:ufx="https://schemas.microsoft.com/dynamics/2017/universalfetchxml">
    <accounts ufx:source="fetch">
        <fetch top="10">
            <entity name="account" />
        </fetch>
    </accounts>
</bag>

En UFX-fråga bearbetas sekventiellt och kan innehålla många FetchXML-frågor.

Här är ett utdrag av resultatet av den tidigare UFX-frågan serialiserad till XML. Observera att vissa värden har metadata som beskriver dem ytterligare.

<bag>
  <accounts ufx-type="list">
    <bag ufx-id="166e39dd-34a1-e611-8111-00155d652f01" ufx-logicalname="account">
      <accountid ufx-type="guid">166e39dd-34a1-e611-8111-00155d652f01</accountid>
      <accountnumber ufx-type="string">ABSS4G45</accountnumber>
      <name ufx-type="string">Fourth Coffee (sample)</name>
      <statecode ufx-type="option" ufx-formatvalue="Active">0</statecode>
      <websiteurl ufx-type="string">https://www.fourthcoffee.com/</websiteurl>
      <primarycontactid ufx-type="lookup" ufx-formatvalue="Yvonne McKay (sample)" ufx-logicalname="contact">7c6e39dd-34a1-e611-8111-00155d652f01</primarycontactid>
      ...
    </bag>
    <bag ufx-type="bag" ufx-id="186e39dd-34a1-e611-8111-00155d652f01" ufx-logicalname="account">
      <accountid ufx-type="guid">186e39dd-34a1-e611-8111-00155d652f01</accountid>
      <accountnumber ufx-type="string">ACTBBDC3</accountnumber>
      <name ufx-type="string">Litware, Inc. (sample)</name>
      <statecode ufx-type="option" ufx-formatvalue="Active">0</statecode>
      <websiteurl ufx-type="string">https://www.litwareinc.com/</websiteurl>
      <primarycontactid ufx-type="lookup" ufx-formatvalue="Susanna Stubberod (sample)" ufx-logicalname="contact">7e6e39dd-34a1-e611-8111-00155d652f01</primarycontactid>
      ...
    </bag>
    ...
  </accounts>
</bag>

select UFX-direktivet tar ett XPath-uttryck som väljer värden från den aktuella påsen.

<bag xmlns:ufx="https://schemas.microsoft.com/dynamics/2017/universalfetchxml">
    <accounts ufx:source="fetch">
        <fetch top="10">
            <entity name="account" />
        </fetch>
    </accounts>

    <first_account_name ufx:select="accounts/bag[1]/name" />

    <!-- null values remove properties from the bag -->
    <accounts ufx:select="$null" />
</bag>

Den resulterande påsen i XML:

<bag>
    <first_account_name ufx-type="string">Fourth Coffee (sample)</first_acount_name>
</bag>

Den mest kraftfulla aspekten av en UFX Query är dess förmåga att dynamiskt generera FetchXML baserat på indata.

I följande exempel söker vi efter konton med ett värde som tillhandahålls av användaren och som är tillgängligt som en UFX-väska via XPath-variabeln $input . Lägg märke till UFX if - och värdedirektiven på elementet condition .

<bag xmlns:ufx="https://schemas.microsoft.com/dynamics/2017/universalfetchxml">
    <accounts ufx:source="fetch">
        <fetch top="10">
            <entity name="account">
                <filter>
                    <condition attribute="name" operator="like" ufx:if="$input/NameFilter">
                        <ufx:value select="$input/NameFilter" attribute="value" />
                    </condition>
                </filter>
            </entity>
        </fetch>
    </accounts>
</bag>

Om egenskapen i indatapåsen NameFilter innehöll %city% det skapade FetchXML-villkoret som körs av Dynamics 365 skulle det se ut så här.

<condition attribute="name" operator="like" value="%city%" />

Nycklar, värden och metadata

En UFX-väska innehåller nycklar och värden, där vissa värden har mer metadata för att beskriva dem.

Ett exempel kan vara ett värde av typen lookup (EntityReference). När den efterfrågas från Dynamics 365 via FetchXML returneras det logiska namnet på entiteten och det formaterade visningsnamnet för posten. UFX-påsen bevarar denna ytterligare information som metadata som är kopplade till det primära värdet.

Serialiserad till JSON ser en lookup med metadata ut så här:

{
    "primarycontactid": "7e6e39dd-34a1-e611-8111-00155d652f01",
    "primarycontactid@ufx-type": "lookup",
    "primarycontactid@ufx-logicalname": "contact",
    "primarycontactid@ufx-formatvalue": "Susanna Stubberod (sample)"
}

I XML:

<primarycontactid ufx-type="lookup" ufx-formatvalue="Susanna Stubberod (sample)" ufx-logicalname="contact">7e6e39dd-34a1-e611-8111-00155d652f01</primarycontactid>

XPath över Dynamics 365-data

Att ha data i en UFX Bag skriven, gör att en UFX Query kan se den i ett strukturerat format och använda XPath för att gå igenom data och välja värden från den.

Ett XPath-uttryck som anges i ett UFX-direktiv ser data i påsen på samma sätt som påsens struktur i XML-serialiserad form. NET-objekt i minnet (i instanser av Entity och EntityCollection typer) och inte i XML-dokument.

Referens för UFX-typ

Alla UFX-typer har stöd för ufx-typeufx-formatvalue och metadata. Ytterligare metadata beskrivs bredvid varje typ.

UFX-namn Kod för attributtyp .NET-namn UFX-metadata
Bool Boolesk Boolesk
Int Heltal Int32
lång BigInt Int64
dubbel dubbel dubbel
decimaltecken Decimal Decimal
tidpunkt Datum och tid Datum och tid
riktlinje Uniqueidentifier (Uniqueidentifier) Guide
snöre PM Sträng
pengar Pengar Pengar
alternativ Plocklista OptionSetValue (AlternativSetVärde)
Sökning Sökning EntityReference ufx-logicalname
påse Inte tillgänglig Enhet ufx-id
ufx-logicalname
lista Inte tillgänglig EntityCollection (på engelska)
Inte tillgänglig Inte tillgänglig AliasedValue (alias) ufx-aliasentity
ufx-aliasattribute

Direktiv för UFX-frågor

UFX-direktiv kan användas på påsegenskaper och på XML-element i en FetchXML-fråga.

Direktiv för UFX-väskor

Egenskap Värde Beskrivning
ufx:if XPath Testar XPath-uttrycket och bearbetar endast egenskapen om testet returnerar true
ufx:source fetch Kör det infogade <fetch> XML-elementet och tilldelar resultatet till egenskapen
ufx:select XPath Kör XPath-uttrycket och tilldelar resultatet till egenskapen
När du frågar efter en bag eller list ett valfritt underordnat bag i XML-formulär kan du ange för att transformera resultatet av XPath-uttrycket

UFX FetchXML-direktiv

Komponent Egenskap Värde Beskrivning
Alla element ufx:if XPath Testar XPath-uttrycket och genererar bara XML-elementet om testerna lyckas
ufx:apply select XPath Loopar över noduppsättningen som returneras av XPath-uttrycket och matar ut de underordnade XML-elementen en gång för varje nod
ufx:value select XPath Kör XPath-uttrycket och matar ut resultatet i det aktuella XML-elementet
ufx:value attribute Namn på attribut Tilldelar XPath-uttryckets resultat till det angivna attributnamnet för det aktuella XML-elementet

UFX XPath-funktioner

UFX lägger till många nya funktioner utöver de som finns tillgängliga i XPath.

datetime()

  • datetime(): Returnerar den aktuella tiden i UTC

lista()

  • lista (väska | lista, ... [bag | list]): Tar ett antal bag or-värden list som indata och plattar ut dem till en enda list

lookup-to-list()

  • lookup-to-list(lookup, ... [lookup]): Tar ett antal värden, konverterar var och en av lookup dem till a med bag metadatauppsättningen ufx-id och ufx-logicalname plattar ut dem till en endalist

alternativ-till-lista()

  • alternativ-till-lista (alternativ, ... [option]): Tar ett antal värden, konverterar vart och ett av option dem till a bag med en enda option egenskap och plattar ut dem till ett enda list

ordning()

  • order(list, string, bool): Beställer en lista efter en egenskap i varje påse. Egenskapen anges i argument 2, fallande anges i argument 3.
  • order (list, list): Ordna en lista efter flera sorteringsordningar som anges som en lista i argument 2. Var bag och en i den andra listan kan ha en name och-egenskap descending

iif()

  • iif(any, any, any): Om argument 1 är sant, returnerar argument 2, annars returneras argument 3

UFX XPath-variabler

Namn Beskrivning
$input En bag tillgänglig för UFX-frågan med indatavärden
$null En null-konstant. Om du väljer $null en egenskap tas den bort från påsen
$current Referens till den aktuella påsen som UFX-frågan bearbetar

Ytterligare resurser

Förstå och anpassa resursmatchning i Universal Resource Scheduling