複数テーブルのルックアップ型の列 ( ポリモーフィックな参照とも呼ばれる) を使用すると、環境内の他のテーブルと複数の一対多 (1:N) リレーションシップを持つ特定のテーブルを使用できます。 単一の検索タイプの列は、他の複数のテーブルを参照できます。 複数テーブル型の列に送信された参照値は、関連するテーブルのレコードと一致します。 ローカル テーブルと仮想テーブルの両方を参照テーブルとして使用して、複数テーブルの参照を作成できます。
現在、Microsoft Dataverseには、Account および Contact テーブルに接続する Customer などの静的型として複数のテーブル型が含まれています。 複数テーブル参照を使用すると、必要なその他の複数テーブル参照を定義できます。
注意
.NETまたは Dataverse Web API 用の SDK を使用して、カスタムの複数テーブル参照を作成および変更できます。 対話型ユーザー インターフェイスのサポートは、今後のリリースで利用可能になる予定です。
サンプル: Web API の複数テーブル参照のサンプル (PowerShell) には、この記事で示されている 例 を示すサンプル コードが含まれています。
関連テーブルに関するデータを取得する
複数テーブルの参照など、ルックアップ列を持つ関連テーブルに関する情報を取得するには、参照プロパティを取得するか、単一値ナビゲーション プロパティを展開する方法のいずれかを使用します。
ルックアップ プロパティを取得する
各ルックアップ列には、 クエリ オプションを使用して取得できる、対応する$selectがあります。 これらのプロパティは、 _<name>_valueという名前付け規則に従います。
<name> はルックアップ列の論理名です。 ルックアップ プロパティの値は、関連レコードの一意識別子 (存在する場合) です。
複数テーブル参照の場合、一意の ID は、それが適用されるテーブルがわかっている場合を除き、価値がありません。 任意の参照列からデータを取得するときに、次の OData 注釈の基本設定を適用できます。 これらの基本設定オプションは、関連レコードからのデータが多く、データの取得元となるテーブルに関する情報が提供されるため、複数テーブル参照で特に便利です。
| Annotation | 説明 |
|---|---|
OData.Community.Display.V1.FormattedValue |
この列に現在設定されているレコードのプライマリ名列の値を返します。 |
Microsoft.Dynamics.CRM.associatednavigationproperty |
この列に現在設定されているレコードをサポートする単一値ナビゲーション プロパティの名前を返します。 |
Microsoft.Dynamics.CRM.lookuplogicalname |
この列に現在設定されているレコードのテーブルの論理名を返します。 |
注意
ルックアップ プロパティを使用して、書式設定された値と、単一値ナビゲーション プロパティを展開するために必要なサポート メタデータを取得し、詳細情報を取得します。
参照プロパティ データの取得について詳しくは、こちらをご覧ください。
単一値ナビゲーション プロパティを展開する
複数テーブル参照を作成する場合、各テーブルには個別の一対多リレーションシップが必要です。 各リレーションシップは、個別の単一値ナビゲーション プロパティを追加します。
この単一値ナビゲーション プロパティの名前は、 OneToManyRelationshipMetadata.ReferencingEntityNavigationPropertyName プロパティに格納されます。 一般的なエラーは、ユーザーがこの大文字と小文字を区別するプロパティの値を推測しようとしたときに発生します。 このナビゲーション プロパティの正しい名前を明確に特定するには、次の 3 つの方法があります。
- リレーションシップメタデータを取得します。 Dataverse スキーマ定義を取得するオプションの詳細について説明します。
- CSDL $metadata ドキュメントをダウンロードして確認します。 $metadata サービス ドキュメントでこれらの単一値ナビゲーション プロパティを識別する方法について説明します。
-
参照プロパティを取得し、
Microsoft.Dynamics.CRM.associatednavigationpropertyOData 注釈の基本設定を含めます。
テーブルに対してクエリを実行する場合は、 $expand クエリ オプションと単一値ナビゲーション プロパティを使用して、関連するテーブルを含めます。
OData $expand クエリ オプションを使用して関連テーブルを結合する方法について説明します。
例
ライブラリ内のユーザーのメディアをホストしているとします。 さまざまなメディア オブジェクトがあります。 それらの多くは同じ名前を持っていますが、書籍、オーディオ、ビデオなどの異なる形式です。
この例では、次の 3 つのテーブルが各特定の種類のメディアをサポートしています。
-
sample_Bookには、sample_name列とsample_callnumber列が含まれます。 -
sample_Audioには、sample_name列とsample_audioformat列が含まれます。 -
sample_Videoには、sample_name列とsample_videoformat列が含まれます。
sample_Media テーブルには、スキーマ名がsample_MediaPolymorphicLookupされた複数テーブル参照があります。 ルックアップ列を設定して、3 つの特定のメディア テーブルのいずれかのレコードを参照できます。
sample_Book テーブル
sample_Book テーブルは、3 つの関連テーブルの最初のテーブルです。 この単純なクエリは、このテーブルにある 2 つのレコードを取得します。
GET [Organization URI]/api/data/v9.2/sample_books?$select=sample_name,sample_callnumber
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json
次の例は、応答の JSON 本文を示しています。
{
"@odata.context": "[Organization URI]/api/data/v9.2/$metadata#sample_books(sample_name,sample_callnumber)",
"value": [
{
"@odata.etag": "W/\"171704230\"",
"sample_callnumber": "ww-3452 ",
"sample_bookid": "00000000-0000-0000-0000-000000000001",
"sample_name": "Content1"
},
{
"@odata.etag": "W/\"171704235\"",
"sample_callnumber": "a4e-87hw",
"sample_bookid": "00000000-0000-0000-0000-000000000005",
"sample_name": "Content2"
}
]
}
sample_Audio テーブル
sample_Audio テーブルは、3 つの関連テーブルの 2 番目のテーブルです。 この単純なクエリは、このテーブル内の 2 つのレコードを取得します。
GET [Organization URI]/api/data/v9.2/sample_audios?$select=sample_name,sample_audioformat
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json
次の例は、応答の JSON 本文を示しています。
{
"@odata.context": "[Organization URI]/api/data/v9.2/$metadata#sample_audios(sample_name,sample_audioformat)",
"value": [
{
"@odata.etag": "W/\"171704242\"",
"sample_audioid": "00000000-0000-0000-0000-000000000002",
"sample_audioformat": "mp4",
"sample_name": "Content1"
},
{
"@odata.etag": "W/\"171704246\"",
"sample_audioid": "00000000-0000-0000-0000-000000000004",
"sample_audioformat": "wma",
"sample_name": "Content3"
}
]
}
sample_Video テーブル
sample_Video テーブルは、3 つの関連テーブルの 3 番目のテーブルです。 この単純なクエリは、このテーブル内の 2 つのレコードを取得します。
GET [Organization URI]/api/data/v9.2/sample_videos?$select=sample_name,sample_videoformat
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json
次の例は、応答の JSON 本文を示しています。
{
"@odata.context": "[Organization URI]/api/data/v9.2/$metadata#sample_videos(sample_name,sample_videoformat)",
"value": [
{
"@odata.etag": "W/\"171704254\"",
"sample_name": "Content2",
"sample_videoformat": "avi",
"sample_videoid": "00000000-0000-0000-0000-000000000006"
},
{
"@odata.etag": "W/\"171704250\"",
"sample_name": "Content3",
"sample_videoformat": "wmv",
"sample_videoid": "00000000-0000-0000-0000-000000000003"
}
]
}
sample_Media テーブル
このテーブルには、スキーマ名 sample_MediaPolymorphicLookup と論理名 sample_mediapolymorphiclookupを持つ複数テーブル参照列があります。
このデモでは、次の表に、サポート レコードに関連する 4 つのレコードのみが含まれています。
sample_name |
sample_mediapolymorphiclookup 値 |
sample_mediapolymorphiclookup 型 |
|---|---|---|
| メディア オブジェクト 1 | 00000000-0000-0000-0000-000000000001 | sample_book |
| メディア オブジェクト 2 | 00000000-0000-0000-0000-000000000002 | sample_audio |
| メディア オブジェクト 3 | 00000000-0000-0000-0000-000000000003 | sample_video |
| メディア オブジェクト 4 | 00000000-0000-0000-0000-000000000004 | sample_audio |
関連データの取得
sample_Media テーブルを使用して、次のクエリ例を実行します。
-
_sample_mediapolymorphiclookup_value参照列の$selectクエリ オプションで、sample_mediapolymorphiclookup参照プロパティを選択します。OData.Community.Display.V1.FormattedValue、Microsoft.Dynamics.CRM.associatednavigationproperty、およびMicrosoft.Dynamics.CRM.lookuplogicalnameodata.include-annotations設定を使用すると、各レコードでこれらの値を取得できます。 - 3 つの単一値ナビゲーション プロパティ (関連するテーブルごとに 1 つ) を展開します。 展開されたナビゲーション プロパティごとに、プライマリ名列 (
sample_name) と、それぞれのカスタム列の値 (sample_callnumber、sample_audioformat、sample_videoformat) が選択されます。
注意
3 つの展開された単一値ナビゲーションのうち 1 つだけにデータが含まれる場合があります。 ルックアップ列が設定されていない場合、3 つはすべて null になります。
これらの操作は、 sample_MediaPolymorphicLookup 参照列を通じてテーブル レコードがどのように関連するかを示しています。
依頼
GET [Organization URI]
/api/data/v9.2/sample_medias
?$select=sample_name,_sample_mediapolymorphiclookup_value
&$expand=sample_MediaPolymorphicLookup_sample_book(
$select=sample_name,sample_callnumber),
sample_MediaPolymorphicLookup_sample_audio(
$select=sample_name,sample_audioformat),
sample_MediaPolymorphicLookup_sample_video(
$select=sample_name,sample_videoformat)
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json
Prefer: odata.include-annotations="OData.Community.Display.V1.FormattedValue,Microsoft.Dynamics.CRM.associatednavigationproperty,Microsoft.Dynamics.CRM.lookuplogicalname"
注意
読みやすくするために、URL は複数行にわたって表示されます。 要求を行うときは、URL が 1 つの連続する文字列になるように、すべての改行と空白を削除します。
応答
これらのクエリ オプションと基本設定ヘッダーを設定すると、応答の本文には次の JSON が含まれます。
{
"@odata.context": "[Organization URI]/api/data/v9.2/$metadata#sample_medias(sample_name,_sample_mediapolymorphiclookup_value,sample_MediaPolymorphicLookup_sample_book(sample_name),sample_MediaPolymorphicLookup_sample_audio(sample_name,sample_audioformat),sample_MediaPolymorphicLookup_sample_video(sample_name))",
"value": [
{
"@odata.etag": "W/\"171704264\"",
"sample_mediaid": "00000000-0000-0000-0000-000000000007",
"sample_name": "Media Object One",
"_sample_mediapolymorphiclookup_value@OData.Community.Display.V1.FormattedValue": "Content1",
"_sample_mediapolymorphiclookup_value@Microsoft.Dynamics.CRM.associatednavigationproperty": "sample_MediaPolymorphicLookup_sample_book",
"_sample_mediapolymorphiclookup_value@Microsoft.Dynamics.CRM.lookuplogicalname": "sample_book",
"_sample_mediapolymorphiclookup_value": "00000000-0000-0000-0000-000000000001",
"sample_MediaPolymorphicLookup_sample_book": {
"sample_bookid": "00000000-0000-0000-0000-000000000001",
"sample_name": "Content1",
"sample_callnumber": "ww-3452"
},
"sample_MediaPolymorphicLookup_sample_audio": null,
"sample_MediaPolymorphicLookup_sample_video": null
},
{
"@odata.etag": "W/\"171704268\"",
"sample_mediaid": "00000000-0000-0000-0000-000000000008",
"sample_name": "Media Object Two",
"_sample_mediapolymorphiclookup_value@OData.Community.Display.V1.FormattedValue": "Content1",
"_sample_mediapolymorphiclookup_value@Microsoft.Dynamics.CRM.associatednavigationproperty": "sample_MediaPolymorphicLookup_sample_audio",
"_sample_mediapolymorphiclookup_value@Microsoft.Dynamics.CRM.lookuplogicalname": "sample_audio",
"_sample_mediapolymorphiclookup_value": "00000000-0000-0000-0000-000000000002",
"sample_MediaPolymorphicLookup_sample_book": null,
"sample_MediaPolymorphicLookup_sample_audio": {
"sample_audioid": "00000000-0000-0000-0000-000000000002",
"sample_name": "Content1",
"sample_audioformat": "mp4"
},
"sample_MediaPolymorphicLookup_sample_video": null
},
{
"@odata.etag": "W/\"171704273\"",
"sample_mediaid": "00000000-0000-0000-0000-000000000009",
"sample_name": "Media Object Three",
"_sample_mediapolymorphiclookup_value@OData.Community.Display.V1.FormattedValue": "Content3",
"_sample_mediapolymorphiclookup_value@Microsoft.Dynamics.CRM.associatednavigationproperty": "sample_MediaPolymorphicLookup_sample_video",
"_sample_mediapolymorphiclookup_value@Microsoft.Dynamics.CRM.lookuplogicalname": "sample_video",
"_sample_mediapolymorphiclookup_value": "00000000-0000-0000-0000-000000000003",
"sample_MediaPolymorphicLookup_sample_book": null,
"sample_MediaPolymorphicLookup_sample_audio": null,
"sample_MediaPolymorphicLookup_sample_video": {
"sample_videoid": "00000000-0000-0000-0000-000000000003",
"sample_name": "Content3",
"sample_videoformat": "wmv"
}
},
{
"@odata.etag": "W/\"171704279\"",
"sample_mediaid": "00000000-0000-0000-0000-000000000010",
"sample_name": "Media Object Four",
"_sample_mediapolymorphiclookup_value@OData.Community.Display.V1.FormattedValue": "Content3",
"_sample_mediapolymorphiclookup_value@Microsoft.Dynamics.CRM.associatednavigationproperty": "sample_MediaPolymorphicLookup_sample_audio",
"_sample_mediapolymorphiclookup_value@Microsoft.Dynamics.CRM.lookuplogicalname": "sample_audio",
"_sample_mediapolymorphiclookup_value": "00000000-0000-0000-0000-000000000004",
"sample_MediaPolymorphicLookup_sample_book": null,
"sample_MediaPolymorphicLookup_sample_audio": {
"sample_audioid": "00000000-0000-0000-0000-000000000004",
"sample_name": "Content3",
"sample_audioformat": "wma"
},
"sample_MediaPolymorphicLookup_sample_video": null
}
]
}
複数テーブル参照列の設定
レコードを更新してポリモーフィックなルックアップ列を設定する方法は、「 単一値ナビゲーション プロパティを使用した関連付け」の説明に従って行います。 正しい単一値ナビゲーション プロパティ名を使用します。 これらの名前では大文字と小文字が区別されます。
依頼
PATCH [Organization Uri]/api/data/v9.2/sample_medias(00000000-0000-0000-0000-000000000007) HTTP/1.1
If-Match: *
OData-MaxVersion: 4.0
OData-Version: 4.0
If-None-Match: null
Accept: application/json
{
"sample_MediaPolymorphicLookup_sample_book@odata.bind": "sample_books(00000000-0000-0000-0000-000000000001)"
}
応答
HTTP/1.1 204 NoContent
OData-Version: 4.0
複数テーブル参照列を作成する
注意
次の例は、Dataverse Web API の使用方法を示しています。 CreatePolymorphicLookupAttributeRequest クラスと CreatePolymorphicLookupAttributeResponse クラスで.NETに SDK を使用することもできます。
CreatePolymorphicLookupAttribute アクションを使用して、複数テーブル参照を作成します。 次の使用例では、polymorphiclookupexamplesolution という一意の名前を持つソリューションの一部として、MSCRM の SolutionUniqueName オプションのパラメーター を使用して列を作成します。
依頼
POST [Organization URI]/api/data/v9.2/CreatePolymorphicLookupAttribute HTTP/1.1
Consistency: Strong
Accept: application/json
OData-MaxVersion: 4.0
Authorization: Bearer [REDACTED]
MSCRM.SolutionUniqueName: polymorphiclookupexamplesolution
OData-Version: 4.0
{
"OneToManyRelationships": [
{
"ReferencedEntity": "sample_book",
"SchemaName": "sample_media_sample_book",
"ReferencingEntity": "sample_media"
},
{
"ReferencedEntity": "sample_audio",
"SchemaName": "sample_media_sample_audio",
"ReferencingEntity": "sample_media",
"CascadeConfiguration": {
"Assign": "NoCascade",
"Share": "NoCascade",
"Delete": "RemoveLink",
"Merge": "NoCascade",
"Reparent": "NoCascade",
"Unshare": "NoCascade"
}
},
{
"ReferencedEntity": "sample_video",
"SchemaName": "sample_media_sample_video",
"ReferencingEntity": "sample_media",
"CascadeConfiguration": {
"Assign": "NoCascade",
"Share": "NoCascade",
"Delete": "RemoveLink",
"Merge": "NoCascade",
"Reparent": "NoCascade",
"Unshare": "NoCascade"
}
}
],
"Lookup": {
"AttributeTypeName": {
"Value": "LookupType"
},
"SchemaName": "sample_MediaPolymorphicLookup",
"Description": {
"LocalizedLabels": [
{
"@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
"Label": "Polymorphic lookup that can reference a Book, Audio, or Video record",
"LanguageCode": 1033
}
],
"@odata.type": "Microsoft.Dynamics.CRM.Label"
},
"AttributeType": "Lookup",
"DisplayName": {
"LocalizedLabels": [
{
"@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
"Label": "Media",
"LanguageCode": 1033
}
],
"@odata.type": "Microsoft.Dynamics.CRM.Label"
},
"@odata.type": "Microsoft.Dynamics.CRM.ComplexLookupAttributeMetadata"
}
}
次の JSON は、 CreatePolymorphicLookupAttributeResponse ComplexType の例です。 ポリモーフィック属性の ID と、作成されたすべてのリレーションシップが含まれます。
{
"@odata.context":
"http://<organization URL>/api/data/v9.2/$metadata#Microsoft.Dynamics.CRM.CreatePolymorphicLookupAttributeResponse",
"RelationshipIds":[
"77d4c6e9-0397-eb11-a81c-000d3a6cfaba",
"7ed4c6e9-0397-eb11-a81c-000d3a6cfaba",
"85d4c6e9-0397-eb11-a81c-000d3a6cfaba"
],
"AttributeId":"d378dd3e-42f4-4bd7-95c7-0ee546c7de40"
}
既存の複数テーブル参照列にリレーションシップを追加する
Web API を使用して既存の複数テーブル参照列にリレーションシップを追加することは、新しい一対多リレーションシップを作成するのと似ています。
Web API を使用して一対多リレーションシップを作成する方法について説明します。 違いは、 OneToManyRelationshipMetadata.Lookup プロパティには、既存のポリモーフィックなルックアップ列と一致する SchemaName 値が必要です。
既存の複数テーブル参照列からリレーションシップを削除する
Web API を使用して既存の複数テーブル参照列からリレーションシップを削除することは、一対多リレーションシップの削除と同じです。
DELETE
RelationshipDefinitions プロパティの値をキーとして使用して、 エンドポイントに.MetadataId要求を送信します。
こちらも参照ください
サンプル: Web API の複数テーブル参照のサンプル (PowerShell)
テーブル定義で Web API を使用する
テーブルの関連付けの作成と更新
Web API を使用したテーブル定義のクエリ
名前または MetadataId を使用してテーブル定義を取得する
Web API を使用したテーブルと列のモデル化
Web API テーブル スキーマ操作のサンプル
Web API テーブル スキーマ操作サンプル (C#)