エンティティ または リンク エンティティ に関連するテーブルを結合して、結果を含む多くの列を返します。 また、関連するテーブルの列の値に条件を適用するために、フィルター要素と共に使用されます。
FetchXml を使用してテーブルを結合する方法について説明します。
例示
次の例は、さまざまな種類のリレーションシップで link-entity を使用する方法を示しています。
多対一リレーションシップ
このクエリは、取引先企業レコードの PrimaryContactId 参照列に基づいて、取引先企業テーブルと連絡先テーブルからデータを返します。
<fetch>
<entity name='account'>
<attribute name='name' />
<link-entity name='contact'
from='contactid'
to='primarycontactid'
link-type='inner'
alias='contact'>
<attribute name='fullname' />
</link-entity>
</entity>
</fetch>
一対多リレーションシップ
このクエリは、連絡先account_primary_contact一対多リレーションシップに基づいて、連絡先テーブルと取引先企業テーブルからデータを返します。
<fetch>
<entity name='contact'>
<attribute name='fullname' />
<link-entity name='account'
from='primarycontactid'
to='contactid'
alias='account'>
<attribute name='name' />
</link-entity>
</entity>
</fetch>
多対多リレーションシップ
このクエリは、teammembership_association多対多リレーションシップを使用して、SystemUser テーブルと Team テーブルからデータを返します。
<fetch>
<entity name='systemuser'>
<attribute name='fullname' />
<link-entity name='teammembership'
from='systemuserid'
to='systemuserid' >
<link-entity name='team'
from='teamid'
to='teamid'
link-type='inner'
alias='team'>
<attribute name='name' />
</link-entity>
</link-entity>
</entity>
</fetch>
Attributes
| 名前 | 必須ですか? | Description |
|---|---|---|
name |
イエス | 関連するテーブルの論理名です。 |
to |
いいえ | 親要素内の列の論理名は、属性で指定された関連テーブル列と一致する必要があります。 技術的には必須ではありませんが、この属性は通常使用されます。 |
from |
いいえ |
属性で指定to一致する関連テーブルの列の論理名。
技術的には必須ではありませんが、この属性は通常使用されます。 |
alias |
いいえ | 関連テーブルの名前を表します。 エイリアスを設定しない場合は、すべての列が一意の名前を持っていることを確認するためにエイリアスが生成されますが、そのエイリアスを使用してフェッチ XML の他の部分のリンク エンティティを参照することはできません。 自動生成されたエイリアスでは、パターン {LogicalName}+{N}が使用されます。ここで、 N は、フェッチ XML 内の 1 から始まるリンク エンティティのシーケンシャル番号です。 |
link-type |
いいえ | 使用するリンクの種類。 既定の動作は 内部です。 リンクの種類のオプションについて |
intersect |
いいえ |
link-entityを使用してテーブルを結合し、列を返さないことを示します(通常は多対多リレーションシップの場合)。 この属性が存在しても、クエリの実行は変更されません。 テーブルを結合するときに、この属性を link-entity に追加できますが、これが意図的であることを示す 属性要素 は含めないでください。 |
from属性とto属性の使用
from属性とto属性の両方の値を設定することをお勧めします。 これらの属性は、通常、一致する列を明示的に定義するために使用されます。 ただし、 from 属性と to 属性は技術的には必要ありません。
注
from属性とto属性で指定された列が同じ型であることが重要です。 異なる列の種類の使用はサポートされていません。 列が同じ型でない場合、Dataverse インフラストラクチャは変換を強制できる可能性がありますが、この方法ではパフォーマンスが大幅に低下する可能性があります。FetchXml の
from属性とto属性の意味は、QueryExpression を使用してクエリを作成するときに使用される対応する LinkEntity.LinkFromAttributeName プロパティと LinkEntity.LinkToAttributeName プロパティの逆です。
どちらの属性も使用せず、2 つのテーブル間にシステム多対多リレーションシップが存在する場合、Dataverse はそのリレーションシップを使用して適切なキー値を選択します。
from属性またはto属性の 1 つのみを指定した場合、Dataverse は、2 つのテーブル間のリレーションシップ スキーマ定義を使用して、正しいリレーションシップの特定を試みます。
それ以外の場合は、次のエラーが表示されます。
コード:
0x80041102
メッセージ:No system many-to-many relationship exists between <table A> and <table B>. If attempting to link through a custom many-to-many relationship ensure that you provide the from and to attributes.
たとえば、これらのクエリの両方で、systemuser テーブルとチーム テーブルの間teammembership_association多対多リレーションシップが使用されます。 この場合、Dataverse は from 属性と to 属性を処理でき、交差テーブルを指定する link-entity は必要ありません。
すべての属性を指定する
<fetch top="2">
<entity name="systemuser">
<attribute name="fullname" />
<link-entity
name="teammembership"
from="systemuserid"
to="systemuserid"
intersect="true"
>
<link-entity
name="team"
from="teamid"
to="teamid"
link-type="inner"
alias="team"
>
<attribute name="name" />
</link-entity>
</link-entity>
</entity>
</fetch>
Dataverse が選択できるようにする
<fetch top="2">
<entity name="systemuser">
<attribute name="fullname" />
<link-entity name="team" alias="team">
<attribute name="name" />
</link-entity>
</entity>
</fetch>
link-type オプション
link-typeを使用して、返されたレコードにフィルターを適用します。 次の表では、有効な link-type 値について説明します。
| 名前 | Description |
|---|---|
inner |
Default. 両方のテーブルの値が一致する行に結果を制限します。 |
outer |
一致する値を持たない親要素からの結果が含まれます。 |
any |
フィルター要素内でこれを使用します。 リンクされたエンティティ内の一致する行を持つ親行に結果を制限します。
anyを使用して関連テーブルの値をフィルター処理する方法について説明します |
not any |
フィルター要素内でこれを使用します。 リンクされたエンティティに一致する行がない親行のみを対象に結果を制限します。
not anyを使用して関連テーブルの値をフィルター処理する方法について説明します |
all |
フィルター要素内でこれを使用します。 リンク エンティティに一致する from 列の値を持つ行が存在するが、それらの一致する行のうち、どの行も このリンク エンティティに定義されている追加のフィルターを満たしていない親行に結果を制限します。 一致するすべてのリンク エンティティ行がいくつかの追加条件を満たす親行を検索するには、追加のフィルターを反転する必要があります。
allを使用して関連テーブルの値をフィルター処理する方法について説明します |
not all |
フィルター要素内でこれを使用します。 リンクされたエンティティ内の一致する行を持つ親行に結果を制限します。 このリンクの種類は、名前にもかかわらず any に相当します。
not allを使用して関連テーブルの値をフィルター処理する方法について説明します |
exists |
パフォーマンス上の利点を提供できる inner のバリエーション。
句で where 条件を使用します。 これは、結果に親行の複数のコピーが必要ない場合に使用します。
exists と in の詳細を確認する |
in |
パフォーマンス上の利点を提供できる inner のバリエーション。
句で where 条件を使用します。 これは、結果に親行の複数のコピーが必要ない場合に使用します。
exists と in の詳細を確認する |
matchfirstrowusingcrossapply |
パフォーマンス上の利点を提供できる inner のバリエーション。 この型は、リンクされたエンティティの一致する行の 1 つの例だけで十分であり、結果内の親行の複数のコピーが必要ない場合に使用します。
matchfirstrowusingcrossapply の詳細を確認する |
親要素
| 名前 | Description |
|---|---|
| エンティティ | フェッチ要素の子 要素 (クエリの "親エンティティ") を指定します。 許可されるエンティティは 1 つだけです。 |
| link-entity | エンティティまたはリンク エンティティに関連するテーブルを結合して、結果を含むより多くの列を返します。 |
子要素
| 名前 | 発生回数 | Description |
|---|---|---|
| all-attributes | 0 または 1 | 各行のすべての null 以外の列値が返されることを示します。 属性 要素を追加しないのと同じです。 ほとんどの場合、この要素を使用することはお勧めしません。 |
| 属性 | 0 または多く | クエリで返す エンティティ または リンク エンティティの 列を指定します。 |
| 命令 | 0 または多く | 結果の行の並べ替え順序を指定します。 |
| link-entity | 0 または多く | エンティティまたはリンク エンティティに関連するテーブルを結合して、結果を含むより多くの列を返します。 |
| フィルター | 0 または 1 | クエリに適用する エンティティ または リンク エンティティの 複雑な条件を指定します。 |