Получить динамику свойств навигации WebAPI

Я пытаюсь получить свойства дочерней сущности через родительскую сущность. Учетная запись Главной книги является родительской сущностью, и я хочу получить подробную информацию обо всех сущностях действия Главной книги, связанных с Учетной записью Главной книги. Действие Главной книги имеет поле поиска для учетной записи Главной книги. Я использую ajax и машинопись для создания URL-адресов и получения данных.

Согласно документации Microsoft:

Если вы не укажете меньший размер страницы, для каждого запроса будет возвращено максимум 5000 объектов. Если есть больше сущностей, которые соответствуют критериям фильтра запросов, свойство @odata.nextLink будет возвращено с результатами. Используйте значение свойства @odata.nextLink с новым GET-запросом, чтобы вернуть следующую страницу данных.

Я возвращаю только 1 родительскую сущность и 1 дочернюю сущность, поэтому я не должен преодолевать этот барьер. Тем не мение,

Когда я использую URL:

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

Я получаю результаты:

{
  "@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
    }
  ]
}

Когда я использую URL:

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

Я получаю результаты:

{
  "@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"
    }
  ]
}

Насколько я понимаю, эти два URL должны возвращать те же самые данные, которые были бы объектами json атрибутов parent и child. В чем разница в этих запросах? Почему мой второй запрос возвращает odata.nextLink вместо представления JSON объекта?

1 ответ

Решение

Разница заключается в том, что при первом запросе вы извлекаете данные из одной записи, а во втором примере - все учетные записи в Главной книге.

Как вы можете себе представить, в этом случае $ expand работает по-разному в зависимости от того, извлекаете ли вы одну запись или коллекцию (некоторое время назад это даже не поддерживалось, и вы получите исключение), чтобы избежать проблем с производительностью. При получении коллекции WebAPI дает вам @odata.nextLink, как вы упомянули, что вы можете использовать для извлечения дочерних записей, используя второй GET.

Вы можете увидеть пример этого в MSDN:

Извлекайте связанные сущности, раскрывая свойства навигации со значениями коллекции: если вы развернете параметры навигации со значениями коллекции, чтобы извлечь связанные сущности для наборов сущностей, свойство @odata.nextLink будет возвращено для связанных сущностей. Вам следует использовать значение свойства @odata.nextLink с новым GET-запросом для возврата необходимых данных.