Joindre des tables à l’aide de OData
Pour contrôler quelles données sont renvoyées depuis les enregistrements de la table associée, utilisez l’$expand
option de requête avec les propriétés de navigation.
- Vous pouvez inclure jusqu’à 15
$expand
options dans une requête. Chaque option$expand
crée une jointure qui peut affecter les performances. - Les requêtes qui développent les propriétés de navigation à valeur de collection peuvent renvoyer des données mises en cache pour les propriétés qui ne reflètent pas des modifications récentes. Il est préférable d’utiliser l’en-tête
If-None-Match
avec la valeurnull
pour remplacer la mise en cache du navigateur. Pour plus d’informations, consultez En savoir plus sur l’utilisation des en-têtes HTTP.
La table suivante décrit les options de requête que vous pouvez postuler dans certaines options $expand
:
Option | Description | Pour plus d’informations |
---|---|---|
$select |
Sélectionnez les propriétés à retourner. | Sélectionner des colonnes |
$filter |
Pour les propriétés de navigation à valeur de collection, limitez les enregistrements retournés. | Lignes de filtre |
$orderby |
Pour les propriétés de navigation à valeur de collection, contrôlez l’ordre des enregistrements retournés. Non pris en charge avec $expand imbriqué. |
$expand imbriqué dans les propriétés de navigation avec une valeur de collection |
$top |
Pour les propriétés de navigation à valeur de collection, limitez le nombre des enregistrements retournés. Non pris en charge avec $expand imbriqué. |
$expand imbriqué dans les propriétés de navigation avec une valeur de collection |
$expand |
Développez les propriétés de navigation dans le jeu d’entités associé. En utilisant $expand dans un $expand s’appelle un $expand imbriqué. |
Expansion imbriquée des propriétés de navigation à valeur unique et $expand imbriqué sur des propriétés de navigation à valeur de collection |
Ces options sont un sous-ensemble des options de requête système décrites dans la section « Version 4.0 OData Partie 1 : Protocol Plus Errata 02 11.2.4.2.1 Développer les options. Les options $skip
, $count
, $search
, et $levels
ne sont pas prises en charge pour l’API web Dataverse.
Utilisez ces options avec $expand
en les ajoutant entre parenthèses après le nom de la propriété de navigation. Séparez chaque option par un point-virgule (;).
Par exemple, dans la requête qui suit :
Demande la propriété
account.name
Rejoint la propriété de navigation
AccountTasks
de la collection demandant :- Propriété
task.subject
- Emplacement où
task.subject
contient la chaîne de caractères «Task
» - Trié par date de
task.createdon
, dans l’ordre décroissant
- Propriété
/accounts?$select=name&$expand=Account_Tasks($select=subject;$filter=contains(subject,'Task');$orderby=createdon desc)
Limiter les colonnes avec $select
Comme pour toute requête, limitez toujours les colonnes renvoyées à l’aide de $select
quand vous utilisez $expand
. Par exemple, la requête suivante renvoie les valeurs contact.fullname
et task.subject
dans les résultats développés du type d’entité account
:
Demande :
GET [Organization URI]/api/data/v9.2/accounts?$select=name
&$expand=primarycontactid($select=fullname),Account_Tasks($select=subject)
Prefer: odata.maxpagesize=1
If-None-Match: null
Accept: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
Réponse :
HTTP/1.1 200 OK
OData-Version: 4.0
Preference-Applied: odata.maxpagesize=1
{
"@odata.context": "[Organization URI]/api/data/v9.2/$metadata#accounts(name,primarycontactid(fullname),Account_Tasks(subject))",
"value": [
{
"@odata.etag": "W/\"80649578\"",
"name": "Litware, Inc. (sample)",
"accountid": "78914942-34cb-ed11-b596-0022481d68cd",
"primarycontactid": {
"fullname": "Susanna Stubberod (sample)",
"contactid": "70bf4d48-34cb-ed11-b596-0022481d68cd"
},
"Account_Tasks": [
{
"@odata.etag": "W/\"80649460\"",
"subject": "Task 1 for Litware",
"_regardingobjectid_value": "78914942-34cb-ed11-b596-0022481d68cd",
"activityid": "f68393c1-34cb-ed11-b597-000d3a993550"
}
],
"Account_Tasks@odata.nextLink": "[Organization URI]/api/data/v9.2/accounts(78914942-34cb-ed11-b596-0022481d68cd)/Account_Tasks?$select=subject"
}
],
"@odata.nextLink": "[Organization URI]/api/data/v9.2/accounts?$select=name&$expand=primarycontactid($select=fullname),Account_Tasks($select=subject)&$skiptoken=%3Ccookie%20pagenumber=%222%22%20pagingcookie=%22%253ccookie%2520page%253d%25221%2522%253e%253caccountid%2520last%253d%2522%257b78914942-34CB-ED11-B596-0022481D68CD%257d%2522%2520first%253d%2522%257b78914942-34CB-ED11-B596-0022481D68CD%257d%2522%2520%252f%253e%253c%252fcookie%253e%22%20istracking=%22False%22%20/%3E"
}
Différences de type de propriété de navigation
Il est important de garder en tête qu’il existe deux types de propriétés de navigation. En savoir plus sur les propriétés de navigation de l’API web
Les propriétés de navigation à valeur unique correspondent aux attributs de recherche qui prennent en charge les relation plusieurs-à-un et permettent de définir une référence à un autre enregistrement.
Les propriétés de navigation avec une valeur de collection correspondent aux relations un-à-plusieurs ou plusieurs-à-plusieurs.
Le développement d’une propriété de navigation à valeur de collection peut augmenter la taille de la réponse d’une manière qu’il est difficile d’anticiper. Il est important que vous incluiez des limites pour contrôler la quantité de données renvoyées. Vous pouvez limiter le nombre d’enregistrements en utilisant la pagination. En savoir plus sur la pagination des résultats
Il existe une différence significative entre la façon dont la pagination est appliquée aux options de $expand imbriquées appliquées aux propriétés de navigation à valeur de collection. En savoir plus sur l’expansion des propriétés de navigation à valeur de collection
Développer les propriétés de navigation à valeur unique
L’exemple suivant montre comment récupérer des enregistrements de contact, y compris le contact principal et l’utilisateur qui a créé les enregistrements.
Demande :
GET [Organization URI]/api/data/v9.2/accounts?$select=name
&$expand=primarycontactid($select=contactid,fullname),createdby($select=fullname)
Prefer: odata.maxpagesize=2
If-None-Match: null
Accept: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
Réponse :
HTTP/1.1 200 OK
Content-Type: application/json; odata.metadata=minimal
Preference-Applied: odata.maxpagesize=2
OData-Version: 4.0
{
"@odata.context": "[Organization URI]/api/data/v9.2/$metadata#accounts(name,primarycontactid(contactid,fullname),createdby(fullname))",
"value": [
{
"@odata.etag": "W/\"80649578\"",
"name": "Litware, Inc. (sample)",
"accountid": "78914942-34cb-ed11-b596-0022481d68cd",
"primarycontactid": {
"contactid": "70bf4d48-34cb-ed11-b596-0022481d68cd",
"fullname": "Susanna Stubberod (sample)"
},
"createdby": {
"fullname": "System Administrator",
"systemuserid": "4026be43-6b69-e111-8f65-78e7d1620f5e",
"ownerid": "4026be43-6b69-e111-8f65-78e7d1620f5e"
}
},
{
"@odata.etag": "W/\"80649580\"",
"name": "Adventure Works (sample)",
"accountid": "7a914942-34cb-ed11-b596-0022481d68cd",
"primarycontactid": {
"contactid": "72bf4d48-34cb-ed11-b596-0022481d68cd",
"fullname": "Nancy Anderson (sample)"
},
"createdby": {
"fullname": "System Administrator",
"systemuserid": "4026be43-6b69-e111-8f65-78e7d1620f5e",
"ownerid": "4026be43-6b69-e111-8f65-78e7d1620f5e"
}
}
],
"@odata.nextLink": "[Organization URI]/api/data/v9.2/accounts?$select=name%0A&$expand=primarycontactid($select=contactid,fullname),createdby($select=fullname)&$skiptoken=%3Ccookie%20pagenumber=%222%22%20pagingcookie=%22%253ccookie%2520page%253d%25221%2522%253e%253caccountid%2520last%253d%2522%257b7A914942-34CB-ED11-B596-0022481D68CD%257d%2522%2520first%253d%2522%257b78914942-34CB-ED11-B596-0022481D68CD%257d%2522%2520%252f%253e%253c%252fcookie%253e%22%20istracking=%22False%22%20/%3E"
}
La propriété de navigation à valeur unique createdby
renvoie une instance de l’EntityType systemuser. Les propriétés systemuserid
et ownerid
sont renvoyées. En effet, systemuser
hérite de EntityType principal et partage la clé primaire ownerid
avec l’équipe EntityType par cet héritage.
Cependant, la Table utilisateur (SystemUser) possède la clé primaire SystemUserId. Les propriétés systemuserid
et ownerid
ont la même valeur. En savoir plus sur l’héritage EntityType
Références de retour
Au lieu de retourner les données, vous pouvez également retourner des références (liens) aux enregistrements associés en développant la propriété de navigation à valeur unique avec l’option /$ref
. L’exemple suivant renvoie des objets JSON avec une propriété @odata.id
qui a une URL pour chaque contact principal.
Demande :
GET [Organization URI]/api/data/v9.2/accounts?$select=name
&$expand=primarycontactid/$ref
Accept: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
Réponse :
HTTP/1.1 200 OK
Content-Type: application/json; odata.metadata=minimal
Preference-Applied: odata.maxpagesize=2
OData-Version: 4.0
{
"@odata.context": "[Organization URI]/api/data/v9.2/$metadata#accounts(name,primarycontactid,primarycontactid/$ref())",
"value": [
{
"@odata.etag": "W/\"80649578\"",
"name": "Litware, Inc. (sample)",
"_primarycontactid_value": "70bf4d48-34cb-ed11-b596-0022481d68cd",
"accountid": "78914942-34cb-ed11-b596-0022481d68cd",
"primarycontactid": {
"@odata.id": "[Organization URI]/api/data/v9.2/contacts(70bf4d48-34cb-ed11-b596-0022481d68cd)"
}
},
{
"@odata.etag": "W/\"80649580\"",
"name": "Adventure Works (sample)",
"_primarycontactid_value": "72bf4d48-34cb-ed11-b596-0022481d68cd",
"accountid": "7a914942-34cb-ed11-b596-0022481d68cd",
"primarycontactid": {
"@odata.id": "[Organization URI]/api/data/v9.2/contacts(72bf4d48-34cb-ed11-b596-0022481d68cd)"
}
}
],
"@odata.nextLink": "[Organization URI]/api/data/v9.2/accounts?$select=name%0A&$expand=primarycontactid/$ref&$skiptoken=%3Ccookie%20pagenumber=%222%22%20pagingcookie=%22%253ccookie%2520page%253d%25221%2522%253e%253caccountid%2520last%253d%2522%257b7A914942-34CB-ED11-B596-0022481D68CD%257d%2522%2520first%253d%2522%257b78914942-34CB-ED11-B596-0022481D68CD%257d%2522%2520%252f%253e%253c%252fcookie%253e%22%20istracking=%22False%22%20/%3E"
}
Vous pouvez uniquement utiliser l’option /$ref
avec les propriétés de navigation à valeur unique. Si vous l’utilisez pour une propriété de navigation avec une valeur de collection, l’erreur suivante est retournée :
{
"error": {
"code": "0x80060888",
"message": "Expand with $ref is only supported on lookup type navigation property."
}
}
Développement imbriqué des propriétés de navigation à valeur unique
Vous pouvez étendre les propriétés de navigation à valeur unique sur plusieurs niveaux en imbriquant une option $expand
dans un autre option $expand
.
La requête suivante renvoie des enregistrements task
et étend le contact
associé, le account
associé au contact
, et enfin le systemuser
qui a créé l’enregistrement account
.
Demande :
GET [Organization URI]/api/data/v9.2/tasks?$select=subject
&$expand=regardingobjectid_contact_task($select=fullname;
$expand=parentcustomerid_account($select=name;
$expand=createdby($select=fullname)))
Accept: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
Prefer: odata.maxpagesize=2
Réponse :
HTTP/1.1 200 OK
Content-Type: application/json; odata.metadata=minimal
Preference-Applied: odata.maxpagesize=2
OData-Version: 4.0
{
"@odata.context": "[Organization URI]/api/data/v9.2/$metadata#tasks(subject,regardingobjectid_contact_task(fullname,parentcustomerid_account(name,createdby(fullname))))",
"value": [
{
"@odata.etag": "W/\"80730855\"",
"subject": "Task 1 for Susanna Stubberod",
"activityid": "e9a8c72c-dbcc-ed11-b597-000d3a993550",
"regardingobjectid_contact_task": {
"fullname": "Susanna Stubberod (sample)",
"contactid": "70bf4d48-34cb-ed11-b596-0022481d68cd",
"parentcustomerid_account": {
"name": "Litware, Inc. (sample)",
"accountid": "78914942-34cb-ed11-b596-0022481d68cd",
"createdby": {
"fullname": "System Administrator",
"systemuserid": "4026be43-6b69-e111-8f65-78e7d1620f5e",
"ownerid": "4026be43-6b69-e111-8f65-78e7d1620f5e"
}
}
}
},
{
"@odata.etag": "W/\"80730861\"",
"subject": "Task 2 for Susanna Stubberod",
"activityid": "c206f534-dbcc-ed11-b597-000d3a993550",
"regardingobjectid_contact_task": {
"fullname": "Susanna Stubberod (sample)",
"contactid": "70bf4d48-34cb-ed11-b596-0022481d68cd",
"parentcustomerid_account": {
"name": "Litware, Inc. (sample)",
"accountid": "78914942-34cb-ed11-b596-0022481d68cd",
"createdby": {
"fullname": "System Administrator",
"systemuserid": "4026be43-6b69-e111-8f65-78e7d1620f5e",
"ownerid": "4026be43-6b69-e111-8f65-78e7d1620f5e"
}
}
}
}
],
"@odata.nextLink": "[Organization URI]/api/data/v9.2/tasks?$select=subject&$expand=regardingobjectid_contact_task($select=fullname;$expand=parentcustomerid_account($select=name;$expand=createdby($select=fullname)))&$skiptoken=%3Ccookie%20pagenumber=%222%22%20pagingcookie=%22%253ccookie%2520page%253d%25221%2522%253e%253cactivityid%2520last%253d%2522%257bC206F534-DBCC-ED11-B597-000D3A993550%257d%2522%2520first%253d%2522%257bE9A8C72C-DBCC-ED11-B597-000D3A993550%257d%2522%2520%252f%253e%253c%252fcookie%253e%22%20istracking=%22False%22%20/%3E"
}
Développer les propriétés de navigation à valeur de collection
Il existe des différences importantes dans la réponse selon que vous utilisez $expand
imbriqué avec une propriété de navigation à valeur de collection n’importe où dans votre requête.
$expand imbriqué | $expand unique | |
---|---|---|
Paging | Pagination sur lignes développées. | Pagination uniquement sur Ressource EntitySet. URL <property name>@odata.nextLink des lignes développées n’incluent pas les informations de pagination. |
$top ou $orderby pris en charge |
Non | Oui |
Relations N à N compatibles | Non Voir $expand imbriqué avec des relations N à N | Oui |
Développez $expand sur les propriétés de navigation avec une valeur de collection
Si vous utilisez uniquement un seul niveau $expand
, aucune pagination n’est appliquée aux lignes développées. Si vous incluez l’en-tête de requête Prefer: odata.maxpagesize
, la pagination n’est appliquée qu’à la ressource EntitySet de la requête.
Chaque propriété de navigation développée à valeur de collection renvoie une <property>@odata.nextLink
URL qui n’inclut aucune information de pagination. Il s’agit d’une URL qui représente la collection filtrée pour la relation avec vos options de requête ajoutées. Vous pouvez utiliser cette URL pour envoyer une requête distincte GET
et elle renvoie les mêmes lignes que celles qui ont été renvoyées dans votre requête d’origine. Vous pouvez appliquer la pagination à cette demande.
Comme aucune pagination n’est appliquée aux enregistrements développés, il est possible de renvoyer jusqu’à 5 000 enregistrements connexes pour chaque propriété de navigation à valeur de collection développée. En fonction de vos données et de la requête, il peut s’agir d’un grand nombre de données. Le renvoi d’une telle quantité de données peut affecter les performances et éventuellement entraîner l’expiration de votre requête. Soyez prudent avec les requêtes que vous composez. Vous pouvez utiliser les options $top
, $filter
et $orderby
pour contrôler le nombre total d’enregistrements renvoyés.
L’exemple suivant inclut un seul développement de Account_Tasks
et contact_customer_accounts
lors de la récupération des enregistrements de compte. L’en-tête de requête Prefer: odata.maxpagesize=1
garantit qu’un seul enregistrement de compte est renvoyé dans la première page.
Demande :
GET [Organization URI]/api/data/v9.2/accounts?$select=name,accountid
&$expand=Account_Tasks($select=subject),contact_customer_accounts($select=fullname)
Prefer: odata.maxpagesize=1
Accept: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
Réponse :
HTTP/1.1 200 OK
Content-Type: application/json; odata.metadata=minimal
Preference-Applied: odata.maxpagesize=1
OData-Version: 4.0
{
"@odata.context": "[Organization URI]/api/data/v9.2/$metadata#accounts(name,accountid,Account_Tasks(subject),contact_customer_accounts(fullname))",
"value": [
{
"@odata.etag": "W/\"80649578\"",
"name": "Litware, Inc. (sample)",
"accountid": "78914942-34cb-ed11-b596-0022481d68cd",
"Account_Tasks": [
{
"@odata.etag": "W/\"80730894\"",
"subject": "Task 1 for Litware",
"_regardingobjectid_value": "78914942-34cb-ed11-b596-0022481d68cd",
"activityid": "be9f6557-e2cc-ed11-b597-000d3a993550"
},
{
"@odata.etag": "W/\"80730903\"",
"subject": "Task 2 for Litware",
"_regardingobjectid_value": "78914942-34cb-ed11-b596-0022481d68cd",
"activityid": "605dbd65-e2cc-ed11-b597-000d3a993550"
},
{
"@odata.etag": "W/\"80730909\"",
"subject": "Task 3 for Litware",
"_regardingobjectid_value": "78914942-34cb-ed11-b596-0022481d68cd",
"activityid": "a718856c-e2cc-ed11-b597-000d3a993550"
}
],
"Account_Tasks@odata.nextLink": "[Organization URI]/api/data/v9.2/accounts(78914942-34cb-ed11-b596-0022481d68cd)/Account_Tasks?$select=subject",
"contact_customer_accounts": [
{
"@odata.etag": "W/\"80648695\"",
"fullname": "Susanna Stubberod (sample)",
"_parentcustomerid_value": "78914942-34cb-ed11-b596-0022481d68cd",
"contactid": "70bf4d48-34cb-ed11-b596-0022481d68cd"
}
],
"contact_customer_accounts@odata.nextLink": "[Organization URI]/api/data/v9.2/accounts(78914942-34cb-ed11-b596-0022481d68cd)/contact_customer_accounts?$select=fullname"
}
],
"@odata.nextLink": "[Organization URI]/api/data/v9.2/accounts?$select=name,accountid&$expand=Account_Tasks($select=subject),contact_customer_accounts($select=fullname)&$skiptoken=%3Ccookie%20pagenumber=%222%22%20pagingcookie=%22%253ccookie%2520page%253d%25221%2522%253e%253caccountid%2520last%253d%2522%257b7A914942-34CB-ED11-B596-0022481D68CD%257d%2522%2520first%253d%2522%257b78914942-34CB-ED11-B596-0022481D68CD%257d%2522%2520%252f%253e%253c%252fcookie%253e%22%20istracking=%22False%22%20/%3E"
}
Comparez cette réponse avec l’exemple suivant, qui inclut un $expand
imbriqué. Faites défiler l’exemple de réponse horizontalement pour voir que seule l’URL @odata.nextLink
du résultat du compte contient des informations de pagination.
$expand imbriqué dans les propriétés de navigation avec une valeur de collection
Si vous utilisez un objet imbriqué $expand
n’importe où dans votre requête et que vous incluez l’en-tête de demande Prefer: odata.maxpagesize
, la pagination est appliquée à chacune des collections développées.
Chaque propriété de navigation développée à valeur de collection renvoie une <property>@odata.nextLink
URL qui inclut des informations de pagination. Vous pouvez utiliser cette URL pour envoyer une requête distincte GET
et elle renverra l’ensemble d’enregistrements qui n’était pas inclus dans votre requête d’origine.
Vous ne pouvez pas utiliser les options $top
ou $orderby
pour limiter le nombre total d’enregistrements renvoyés avec un $expand
imbriqué. L’erreur suivante est renvoyée si vous utilisez ces options :
{
"error": {
"code": "0x80060888",
"message": "Only $select and $filter clause can be provided while doing $expand on many-to-one relationship or nested one-to-many relationship."
}
}
L’exemple suivant est basé sur l’exemple précédent et utilise les mêmes données. La seule différence est l’ajout dans l’URL de ce $expand
imbriqué sur une propriété de navigation à valeur unique pour renvoyer le utilisateur propriétaire du contact : ;$expand=owninguser($select=fullname)
.
Demande :
GET [Organization URI]/api/data/v9.2/accounts?$select=name,accountid
&$expand=Account_Tasks($select=subject),contact_customer_accounts($select=fullname;
$expand=owninguser($select=fullname))
Prefer: odata.maxpagesize=1
Accept: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
Réponse :
HTTP/1.1 200 OK
Content-Type: application/json; odata.metadata=minimal
Preference-Applied: odata.maxpagesize=1
OData-Version: 4.0
{
"@odata.context": "[Organization URI]/api/data/v9.2/$metadata#accounts(name,accountid,Account_Tasks(subject),contact_customer_accounts(fullname,owninguser(fullname)))",
"value": [
{
"@odata.etag": "W/\"80649578\"",
"name": "Litware, Inc. (sample)",
"accountid": "78914942-34cb-ed11-b596-0022481d68cd",
"Account_Tasks": [
{
"subject": "Task 1 for Litware",
"activityid": "be9f6557-e2cc-ed11-b597-000d3a993550"
}
],
"Account_Tasks@odata.nextLink": "[Organization URI]/api/data/v9.2/accounts(78914942-34cb-ed11-b596-0022481d68cd)/Account_Tasks?$select=subject,description&$skiptoken=%3Ccookie%20pagenumber=%222%22%20pagingcookie=%22%253ccookie%2520page%253d%25221%2522%2520countOfRecords%253d%25221%2522%253e%253cactivityid%2520last%253d%2522%257bbe9f6557-e2cc-ed11-b597-000d3a993550%257d%2522%2520first%253d%2522%257bbe9f6557-e2cc-ed11-b597-000d3a993550%257d%2522%2520%252f%253e%253c%252fcookie%253e%22%20istracking=%22False%22%20/%3E",
"contact_customer_accounts": [
{
"fullname": "Susanna Stubberod (sample)",
"contactid": "70bf4d48-34cb-ed11-b596-0022481d68cd",
"owninguser": {
"fullname": "System Administrator",
"systemuserid": "4026be43-6b69-e111-8f65-78e7d1620f5e",
"ownerid": "4026be43-6b69-e111-8f65-78e7d1620f5e"
}
}
],
"contact_customer_accounts@odata.nextLink": "[Organization URI]/api/data/v9.2/accounts(78914942-34cb-ed11-b596-0022481d68cd)/contact_customer_accounts?$select=fullname&$expand=owninguser($select=fullname)&$skiptoken=%3Ccookie%20pagenumber=%222%22%20pagingcookie=%22%253ccookie%2520page%253d%25221%2522%2520countOfRecords%253d%25221%2522%253e%253ccontactid%2520last%253d%2522%257b70bf4d48-34cb-ed11-b596-0022481d68cd%257d%2522%2520first%253d%2522%257b70bf4d48-34cb-ed11-b596-0022481d68cd%257d%2522%2520%252f%253e%253c%252fcookie%253e%22%20istracking=%22False%22%20/%3E"
}
],
"@odata.nextLink": "[Organization URI]/api/data/v9.2/accounts?$select=name,accountid&$expand=Account_Tasks($select=subject,description),contact_customer_accounts($select=fullname;$expand=owninguser($select=fullname))&$skiptoken=%3Ccookie%20pagenumber=%222%22%20pagingcookie=%22%253ccookie%2520page%253d%25221%2522%2520countOfRecords%253d%25221%2522%253e%253caccountid%2520last%253d%2522%257b78914942-34cb-ed11-b596-0022481d68cd%257d%2522%2520first%253d%2522%257b78914942-34cb-ed11-b596-0022481d68cd%257d%2522%2520%252f%253e%253c%252fcookie%253e%22%20istracking=%22False%22%20/%3E"
}
Comparez cette réponse avec l’exemple précédent, qui n’utilise pas de $expand
imbriqué. Dans cette réponse :
- L’
Prefer: odata.maxpagesize=1
en-tête de requête est appliqué aux enregistrementstask
renvoyés avecAccount_Tasks
. - Une seule tâche est renvoyée au lieu de trois.
- L’ URL
Account_Tasks@odata.nextLink
renvoie les deux tâches suivantes. - Faites défiler l’exemple de réponse horizontalement pour voir que les URL
Account_Tasks@odata.nextLink
,contact_customer_accounts@odata.nextLink
et@odata.nextLink
contiennent des informations de pagination.
$expand imbriquées avec des relations N :N
Lorsqu’une propriété de navigation à valeur de collection représente une relation N à N, vous obtenez l’erreur suivante lorsque vous utilisez des instructions imbriquées $expand
:
{
"error": {
"code": "0x80060888",
"message": "The navigation property '<NAME>' cannot be expanded. Only many-to-one relationships are supported for nested expansion."
}
}
Par exemple, si vous utilisez la table Dynamics Lead, qui a une contactleads_association
relation N à N avec la table de contact, la requête suivante renvoie l’erreur, car elle inclut ;$expand=createdby
.
GET [Organization URI]/contacts?$select=fullname$expand=contactleads_association($select=fullname;$expand=createdby)
Pour éviter cette erreur, vous pouvez construire la requête à l’aide de FetchXml. Par exemple :
<fetch>
<entity name='contact'>
<attribute name='fullname' />
<link-entity name='contactleads'
from='contactid'
to='contactid'
alias='cl'>
<link-entity name='lead'
from='leadid'
to='leadid'
alias='lead'>
<attribute name='fullname' />
<link-entity name='systemuser'
from='systemuserid'
to='createdby'
alias='systemuser'>
<attribute name='fullname' />
</link-entity>
</link-entity>
</link-entity>
</entity>
</fetch>
En savoir plus sur la jointure de tables à l’aide de relations plusieurs-à-plusieurs avec FetchXml
Étapes suivantes
Découvrez comment trier des lignes.