Universal FetchXML (UFX) は、動的 FetchXML を使用してデータをクエリし、結果のデータを整形し、 Universal Resource Scheduling (URS) ソリューションで使用できるように準備できる高度なクエリ言語です。 このクエリ言語を使用すると、カスタム クエリを作成して、スケジュール ボードとスケジュール アシスタント フィルターをカスタマイズおよび拡張し、組織固有のビジネス ニーズを満たすことができます。
UFX は、UFX バッグと UFX クエリの 2 つのコンポーネントで構成されています。
シンプルなUFXバッグ
UFX バッグには、静的型データが含まれています。 メモリ内では、キーと値を持つ辞書をモデル化します。 JSON と XML にシリアル化できます。 データを型指定すると、 UFX クエリ でデータをクエリし、クライアント UI をデータにバインドできます。
実用的およびパフォーマンス上の理由から、インメモリ バッグは Dynamics 365 アプリ SDK Entity オブジェクトの上に実装されます。
2 つの値を含むサンプル バッグ。
メモリ内:
| キー | 価値 | 型 |
|---|---|---|
| 名前 | John | 文字列 |
| 年齢 | 36 | 整数 (int) |
JSON の場合:
{
"name": "John",
"age": 36
}
XML の場合:
<bag>
<name ufx-type="string">John</name>
<age ufx-type="int">36</age>
</bag>
UFX がサポートするタイプ
UFX バッグには、多くの種類の値を含めることができます。 これらは、次の 3 つのタイプ クラスに分類されます。
| カテゴリ | 価値 |
|---|---|
| 単純型 |
bool (Boolean)、 int (Int32)、 long (Int64)、 double (Double)、 decimal (Decimal)、 datetime (DateTime)、 guid (Guid)、 string (String)Dynamics 365 固有の単純型: money (Money)、 option (OptionSet)、 lookup (EntityReference) |
| その他のバッグ | bag (Entity) |
| バッグ一覧 | list (EntityCollection) |
以下は、その他のタイプを含むサンプル JSON バッグです。
{
"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" }
]
}
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 クエリ
UFX クエリは、XML ベースの UFX バッグとして記述されます。 バッグ内のプロパティには、データを動的にクエリするための UFX ディレクティブ を含めることができます。 UFX クエリは、XML ではなくメモリ内オブジェクトに対して実行されます。 ディレクティブのみが XML で記述されます。 その出力は、JSONまたはXMLにシリアル化できます。
次の UFX クエリは、source UFX ディレクティブを使用してバッグ内の accounts プロパティを定義します。 その結果、Dynamics 365 はインライン FetchXML を実行し、 accounts プロパティにバッグのリストを設定します。 各バッグが Dynamics 365 の個々の取引先企業レコードを表す EntityCollection 。
<bag xmlns:ufx="https://schemas.microsoft.com/dynamics/2017/universalfetchxml">
<accounts ufx:source="fetch">
<fetch top="10">
<entity name="account" />
</fetch>
</accounts>
</bag>
UFX クエリは順番に処理され、多くの FetchXML クエリを含めることができます。
以下は、XML にシリアル化された前の UFX クエリの結果のスニペットです。 一部の値には、それらをさらに説明するメタデータがあることを確認します。
<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 ディレクティブは、現在のバッグから値を選択する XPath 式を取ります。
<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>
XML で生成されたバッグ:
<bag>
<first_account_name ufx-type="string">Fourth Coffee (sample)</first_acount_name>
</bag>
確かに、UFX クエリの最も強力な側面は、入力データに基づいて FetchXML を動的に生成する機能です。
次のサンプルでは、ユーザーによって提供され、XPath $input 変数を介して UFX バッグとして使用できる値でアカウントを検索します。
要素の UFX if ディレクティブと 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>
入力バッグの NameFilter プロパティが %city% 含まれている場合、Dynamics 365 によって実行される生成された FetchXML 条件は次のようになります。
<condition attribute="name" operator="like" value="%city%" />
キー、値、メタデータ
UFX バッグにはキーと値が含まれており、一部の値にはそれらを記述するためのメタデータが増えています。
たとえば、 lookup (EntityReference) 型の値などです。 FetchXML を介して Dynamics 365 からクエリを実行すると、エンティティの論理名とレコードの書式設定された表示名が返されます。 UFX バッグは、これらの追加情報をプライマリ値に添付されたメタデータとして保持します。
JSON にシリアル化されたメタデータを持つ lookup は次のようになります。
{
"primarycontactid": "7e6e39dd-34a1-e611-8111-00155d652f01",
"primarycontactid@ufx-type": "lookup",
"primarycontactid@ufx-logicalname": "contact",
"primarycontactid@ufx-formatvalue": "Susanna Stubberod (sample)"
}
XML の場合:
<primarycontactid ufx-type="lookup" ufx-formatvalue="Susanna Stubberod (sample)" ufx-logicalname="contact">7e6e39dd-34a1-e611-8111-00155d652f01</primarycontactid>
Dynamics 365 データに対する XPath
UFX Bag 内のデータを入力することで、UFX クエリで構造化された形式でデータを表示し、XPath を使用してデータを走査し、そこから値を選択できるようになります。
UFX ディレクティブで指定された XPath 式は、XML シリアル化された形式のバッグの構造と同様に、バッグ内のデータを参照します。 ただし、データはメモリ内の .NET オブジェクト ( Entity 型と EntityCollection 型のインスタンス) に格納され、XML ドキュメントには格納されません。
UFX タイプリファレンス
すべての UFX タイプは、 ufx-type メタデータと ufx-formatvalue メタデータをサポートします。 追加のメタデータは、各タイプの横に記載されています。
| UFXの名前 | 属性タイプコード | .NET 名 | UFX メタデータ |
|---|---|---|---|
| ブール (bool) | ブール値 | ブール値 | |
| 整数 (int) | 整数 | Int32 | |
| 長い | ビッグイント | Int64 | |
| ダブル | ダブル | ダブル | |
| 10 進 | 小数 | 小数 | |
| datetime | 日付と時間 | 日付と時間 | |
| guid | ユニーク識別子 | Guid | |
| 文字列 | メモ | 糸 | |
| お金 | お金 | お金 | |
| オプション | ピックリスト | オプションセット値 | |
| 検索 | 参照 | EntityReference | ufx-logicalname |
| 袋 | なし | エンティティ | ufx-idufx-logicalname |
| リスト | なし | エンティティコレクション | |
| なし | なし | エイリアス値 | ufx-aliasentityufx-aliasattribute |
UFX クエリ ディレクティブ
UFX ディレクティブは、bag プロパティと FetchXML クエリの XML 要素で使用できます。
UFX バッグのディレクティブ
| 特性 | 価値 | 説明 |
|---|---|---|
ufx:if |
XPath | XPath 式をテストし、テストが true を返した場合にのみプロパティを処理します |
ufx:source |
fetch |
インライン <fetch> XML 要素を実行し、結果をプロパティに割り当てます |
ufx:select |
XPath | XPath 式を実行し、結果をプロパティに割り当てますbagをクエリするか、listをクエリする場合、XML 形式のオプションの子bagを指定して、XPath 式の結果を変換できます |
UFX FetchXML ディレクティブ
| 要素 | 特性 | 価値 | 説明 |
|---|---|---|---|
| すべての要素 | ufx:if |
XPath | XPath 式をテストし、テストが成功した場合にのみ XML エレメントを出力します |
ufx:apply |
select |
XPath | XPath 式によって返されたノードセットをループし、ノードごとに子 XML 要素を出力します |
ufx:value |
select |
XPath | XPath 式を実行し、結果を現在の XML 要素に出力します |
ufx:value |
attribute |
属性名 | XPath 式の結果を、現在の XML エレメントの指定された属性名に割り当てます |
UFX XPath 関数
UFX は、XPath でネイティブに利用可能な機能に加えて、多くの新機能を追加します。
日時()
- datetime(): 現在の時刻を UTC で返します。
リスト()
- list(バッグ | list, ...[bag | list]): 複数の
bagまたはlistの値を入力として受け取り、それらを 1 つに平坦化しますlist
ルックアップからリストへ
- lookup-to-list(ルックアップ)[lookup]): いくつかの
lookup値を受け取り、それぞれをbagとufx-idメタデータが設定されたufx-logicalnameに変換し、それらを 1 つにフラット化します。list
オプションからリストへの変換()
- option-to-list(オプション, ...[option]): いくつかの
option値を取り、それぞれを 1 つのbagプロパティを持つ 1 つのoptionに変換し、それらを 1 つのlist
注文()
- order(list, string, bool): 各バッグ内のプロパティでリストを並べ替えます。 プロパティは引数 2 で指定され、降順は引数 3 で指定されます。
- order(list, list): 引数 2 でリストとして指定された複数のソート順でリストを並べ替えます。 2 番目のリストの各
bagには、nameプロパティとdescendingプロパティを含めることができます
iif()
- iif(any, any, any): 引数 1 が true の場合は引数 2 を返し、それ以外の場合は引数 3 を返します
UFX XPath 変数
| 名前 | 説明 |
|---|---|
| $input | 入力値を持つ UFX クエリで使用できるbag |
| $null | null 定数。 プロパティの $null を選択すると、そのプロパティはバッグから削除されます |
| $current | UFX クエリが処理している現在のバッグへの参照 |