2 votes

Récupérer la propriété de navigation Dynamics WebAPI

J'essaie de récupérer les propriétés d'une entité enfant via l'entité parent. Le grand livre est l'entité mère et je souhaite obtenir les détails de toutes les entités Action du grand livre qui sont liées au grand livre. L'entité General Ledger Action possède un champ de consultation vers l'entité General Ledger Account. J'utilise ajax y texte dactylographié pour construire les url et récupérer les données.

Según Documentation Microsoft :

À moins que vous ne spécifiiez une taille de page plus petite, un maximum de 5 000 entités sera renvoyé pour chaque demande. S'il y a plus d'entités qui correspondent aux critères de filtrage de la requête, une propriété @odata.nextLink sera renvoyée avec les résultats. Utilisez la valeur de la propriété @odata.nextLink avec une nouvelle requête GET pour renvoyer la page de données suivante.

Je ne renvoie qu'une entité parentale et une entité enfant, je ne devrais donc pas rencontrer cet obstacle. Je ne devrais donc pas rencontrer cet obstacle,

Lorsque j'utilise l'url :

https://crm.com/api/data/v8.0/ccseq_generalledgeraccounts(48513938-7d5a-e711-80e5-005056b33317)/ccseq_generalledgeraccount_ccseq_generalledgeraction_GeneralLedgerAccountID

J'obtiens les résultats :

{
  "@odata.context":"https://crm.com/api/data/v8.0/$metadata#ccseq_generalledgeractions","value":[
    {
      "@odata.etag":"W/\"676070510\"","_organizationid_value":"ff05a89b-16b0-44a6-879c-26866b3a9d9d","ccseq_servicecode":"111","modifiedon":"2017-06-26T14:41:49Z","ccseq_generalledgernumber":"44000","ccseq_dollar":25.0000,"statecode":0,"ccseq_percent":0.0000000000,"statuscode":1,"_createdby_value":"3b0731e3-52bd-e611-80df-005056b33317","ccseq_jobclasscode":"111","ccseq_companycode":"111","_ccseq_generalledgeraccountid_value":"48513938-7d5a-e711-80e5-005056b33317","ccseq_dollar_base":25.0000,"_modifiedby_value":"3b0731e3-52bd-e611-80df-005056b33317","versionnumber":676070510,"exchangerate":1.0000000000,"ccseq_generalledgeractionid":"3e17f993-7d5a-e711-80e5-005056b33317","ccseq_geographycode":"111","createdon":"2017-06-26T14:41:49Z","_transactioncurrencyid_value":"863aa006-cae5-dc11-92e8-001a6449bbe7","_modifiedonbehalfby_value":null,"_createdonbehalfby_value":null,"utcconversiontimezonecode":null,"timezoneruleversionnumber":null,"importsequencenumber":null,"ccseq_name":null,"overriddencreatedon":null
    }
  ]
}

Lorsque j'utilise l'url :

https://crm.com/api/data/v8.0/ccseq_generalledgeraccounts?$select=ccseq_code&$expand=ccseq_generalledgeraccount_ccseq_generalledgeraction_GeneralLedgerAccountID

J'obtiens les résultats :

{
  "@odata.context":"https://crm.com/api/data/v8.0/$metadata#ccseq_generalledgeraccounts(ccseq_code,ccseq_generalledgeraccount_ccseq_generalledgeraction_GeneralLedgerAccountID)","value":[
    {
      "@odata.etag":"W/\"676070286\"","ccseq_code":null,"ccseq_generalledgeraccountid":"48513938-7d5a-e711-80e5-005056b33317","ccseq_generalledgeraccount_ccseq_generalledgeraction_GeneralLedgerAccountID":[

      ],"ccseq_generalledgeraccount_ccseq_generalledgeraction_GeneralLedgerAccountID@odata.nextLink":"https://crminternal.cohencpa.com/COHEN/api/data/v8.0/ccseq_generalledgeraccounts(48513938-7d5a-e711-80e5-005056b33317)/ccseq_generalledgeraccount_ccseq_generalledgeraction_GeneralLedgerAccountID"
    }
  ]
}

Si j'ai bien compris, ces deux url devraient renvoyer exactement les mêmes données, à savoir un objet json contenant les attributs parent et enfant. Quelle est la différence entre ces deux requêtes ? Pourquoi ma deuxième requête renvoie-t-elle l'objet odata.nextLink au lieu de la représentation json de l'entité ?

1voto

Federico Jousset Points 1343

La différence est que dans votre première requête, vous récupérez les données d'un seul enregistrement, alors que dans le second exemple, vous récupérez tous les comptes du grand livre.

Comme vous pouvez l'imaginer à ce stade, $expand fonctionne différemment selon que vous récupérez un seul enregistrement ou une collection (il y a quelque temps, cela n'était même pas supporté et vous obteniez une exception) afin d'éviter les problèmes de performance. Lorsque vous récupérez une collection, la WebAPI vous donne le lien @odata.nextLink, comme vous l'avez mentionné, que vous pouvez utiliser pour récupérer les enregistrements enfants en utilisant un second GET.

Vous pouvez en voir un exemple dans le MSDN :

Récupérer les entités apparentées en développant la valeur de la collection de la collection : Si vous élargissez les paramètres de navigation à valeur de collection pour récupérer des entités connexes pour les ensembles d'entités, une propriété @odata.nextLink sera renvoyée pour les entités connexes. Vous devez utiliser la propriété valeur de la propriété @odata.nextLink avec une nouvelle requête GET pour renvoyer les les données requises.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X