Unir tabelas usando o OData

Junte tabelas usando o OData aplicando a $expand às propriedades de navegação. Essa abordagem permite controlar quais dados são retornados de registros de tabela relacionados ao consultar a API Web do Dataverse.

  • Você pode incluir até 15 $expand opções em uma consulta. Cada $expand opção cria uma junção que pode afetar o desempenho.
  • Consultas que expandem propriedades de navegação com valor de coleção podem retornar dados armazenados em cache para essas propriedades que não refletem alterações recentes. Use o cabeçalho If-None-Match com o valor null para substituir o cache do navegador. Saiba mais sobre como usar cabeçalhos HTTP para obter mais detalhes.

A tabela a seguir descreve as opções de consulta que você pode aplicar em determinadas $expand opções:

Opção Description Mais informações
$select Selecione quais propriedades são retornadas. Selecionar colunas
$filter Para propriedades de navegação com valor de coleção, limite os registros retornados. Filtrar linhas
$orderby Para propriedades de navegação com valor de coleção, controle a ordem em que os registros são retornados. Não é compatível com o $expand aninhado. $expand aninhado em propriedades de navegação com valor de coleção
$top Para propriedades de navegação com valor de coleção, limite o número de registros retornados. Não é compatível com o $expand aninhado. $expand aninhado em propriedades de navegação com valor de coleção
$expand Expanda as propriedades de navegação no conjunto de entidades relacionadas. Usar $expand em um $expand é chamado de aninhado $expand. Expand aninhado de propriedades de navegação com valor único e $expand aninhado em propriedades de navegação com valor de coleção

Essas opções são um subconjunto das opções de consulta descritas nas Opções de Expansão do OData Versão 4.0 1: Protocolo Mais Errata 02 11.2.4.2.1. As opções$skip, $count$searche $levels não têm suporte para a API Web do Dataverse.

Use essas opções adicionando-as $expand em parênteses após o nome da propriedade de navegação. Separe cada opção com um ponto-e-vírgula (;).

Por exemplo, a seguinte consulta:

  • Solicita a account.name propriedade

  • Ingressa na propriedade de navegação com valor de coleção AccountTasks solicitando:

    • A propriedade task.subject
    • Onde a task.subject string contém "Task"
    • Ordenado pela task.createdon data, decrescente
/accounts?$select=name&$expand=Account_Tasks($select=subject;$filter=contains(subject,'Task');$orderby=createdon desc)

Limitar colunas com $select

Assim como acontece com qualquer consulta, sempre limite as colunas retornadas usando $select quando você usa $expand. Por exemplo, a solicitação a seguir retorna os valores contact.fullname e task.subject nos resultados expandidos do tipo de entidade account.

Solicitação:

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  

Resposta:

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"
}

Diferenças de propriedade de navegação com valor único e com valor de coleção

Importante

Lembre-se de que há dois tipos de propriedades de navegação. Saiba mais sobre as propriedades de navegação da API Web

  • As propriedades de navegação com valor único correspondem a atributos de pesquisa que dão suporte a relações muitos para um e permitem definir uma referência a outro registro.

  • As propriedades de navegação Valor de coleção correspondem a relacionamentos um para muitos ou muitos para muitos.

Expandir uma propriedade de navegação com valor de coleção pode tornar o tamanho da resposta grande de maneiras difíceis de prever. É importante que você inclua limites para controlar a quantidade de dados retornada. Você pode limitar a quantidade de registros utilizando técnicas de paginação. Saiba mais sobre os resultados da paginação

Há uma diferença significativa na forma como a paginação é aplicada a opções de $expand aninhadas aplicadas a propriedades de navegação com valor de coleção. Saiba mais sobre como expandir as propriedades de navegação com valor de coleção

Expandir propriedades de navegação com valor único

O exemplo a seguir demonstra como recuperar registros de contato, incluindo o contato primário e o usuário que criou os registros.

Solicitação:

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

Resposta:

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"
}

A createdby propriedade de navegação com valor único retorna uma instância do systemuser EntityType. Ambas as propriedades systemuserid e ownerid são retornadas. Esse retorno ocorre porque systemuser herda do EntityType principal e compartilha a chave primária com o owneridEntityType da equipe por meio dessa herança.

No entanto, a tabela Usuário (SystemUser) tem a chave primária de SystemUserId. Ambas as propriedades systemuserid e ownerid têm o mesmo valor. Saiba mais sobre a herança EntityType

Referências de retorno

Em vez de retornar dados, você também pode retornar referências ou links para os registros relacionados expandindo a propriedade de navegação com valor único com a opção /$ref . O exemplo a seguir retorna objetos JSON com uma @odata.id propriedade que tem uma URL para cada contato primário.

Solicitação:

GET [Organization URI]/api/data/v9.2/accounts?$select=name
&$expand=primarycontactid/$ref  
Accept: application/json  
OData-MaxVersion: 4.0  
OData-Version: 4.0  

Resposta:

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"
}

Você só pode usar a opção /$ref com propriedades de navegação de valor único. Se você usá-la com uma propriedade de navegação com valor de coleção, receberá o seguinte erro:

{
    "error": {
        "code": "0x80060888",
        "message": "Expand with $ref is only supported on lookup type navigation property."
    }
}

Expansão aninhada de propriedades de navegação com valor único

Você pode expandir propriedades de navegação de valor único para vários níveis aninhando a opção $expand dentro de outra opção $expand.

A consulta a seguir retorna task registros e expande os contact relacionados, os account relacionados ao contact e o systemuser que criou o registro account:

Solicitação:

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

Resposta:

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"
}

Propriedades de navegação de valor de coleção de expansão

Há algumas diferenças importantes na resposta que dependem se você usa $expand aninhado com uma propriedade de navegação com valor de coleção em qualquer lugar em sua consulta.

$expand aninhado $expand único
Paginação Paginação em linhas expandidas. Paginação somente no recurso EntitySet. <property name>@odata.nextLink As URLs para linhas expandidas não incluem informações de paginação.
$top ou $orderby com suporte No Yes
Relações N:N suportadas Não. Consulte $expand aninhado com relacionamentos N:N Yes

$expand único em propriedades de navegação com valor de coleção

Se você usar apenas um nível $expand, o serviço não aplicará paginação às linhas expandidas. Se você incluir o Prefer: odata.maxpagesize cabeçalho da solicitação, o serviço aplicará paginação somente ao recurso EntitySet da consulta.

Cada propriedade de navegação de coleção de valores expandida retorna um <property>@odata.nextLink URL que não contém informações de paginação. Essa URL representa a coleção filtrada do relacionamento com as opções de consulta acrescentadas. Você pode usar essa URL para enviar uma solicitação separada GET e ela retorna as mesmas linhas que foram retornadas em sua solicitação original. Você pode aplicar a paginação a essa solicitação.

Como o serviço não aplica paginação aos registros expandidos, até 5.000 registros de tabela relacionados podem ser retornados para cada propriedade de navegação expandida com valor de coleção. Dependendo dos dados e da consulta, essa quantidade pode ser grande. Retornar muitos dados pode afetar o desempenho e, possivelmente, fazer com que sua solicitação tenha um tempo limite. Tenha cuidado com as consultas que você redigir. Use as opções $top, $filter e $orderby para controlar o número total de registros retornados.

O exemplo a seguir inclui uma única expansão dos Account_Tasks e contact_customer_accounts ao recuperar os registros de conta. O Prefer: odata.maxpagesize=1 cabeçalho da solicitação garante que apenas um registro de conta seja retornado na primeira página.

Solicitação:

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  

Resposta:

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"
}

Compare esta resposta com o exemplo a seguir, que inclui um $expand aninhado. Para ver que apenas a @odata.nextLink URL do resultado da consulta da conta contém informações de paginação, role a resposta de exemplo horizontalmente.

$expand aninhado em propriedades de navegação com valor de coleção

Se você usar um $expand aninhado em qualquer lugar da consulta e incluir o cabeçalho de solicitação Prefer: odata.maxpagesize, o Dataverse aplicará paginação a cada uma das coleções expandidas.

Cada propriedade de navegação com valor de coleção expandida retorna uma URL <property>@odata.nextLink que inclui informações de paginação. Você pode usar essa URL para enviar uma solicitação separada GET e ela retorna o próximo conjunto de registros que não foram incluídos em sua solicitação original.

Você não pode usar as opções $top ou $orderby para limitar o número total de registros retornados com um $expand aninhado. O serviço retornará o seguinte erro se você usar estas opções:

{
    "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."
    }
}

O exemplo a seguir baseia-se no exemplo anterior e usa os mesmos dados. A única diferença é a adição na URL deste $expand aninhado em uma propriedade de navegação de valor único para retornar o proprietário do contato: ;$expand=owninguser($select=fullname).

Solicitação:

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  

Resposta:

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"
}

Compare essa resposta com o exemplo anterior, que não usa um elemento aninhado $expand. Nesta resposta:

  • O Prefer: odata.maxpagesize=1 cabeçalho da solicitação é aplicado aos task registros retornados com Account_Tasks.
  • A resposta retorna apenas uma tarefa em vez de três.
  • A Account_Tasks@odata.nextLink URL retorna as duas próximas tarefas.
  • Role a resposta de exemplo horizontalmente para ver que as URLs Account_Tasks@odata.nextLink, contact_customer_accounts@odata.nextLink, and @odata.nextLink contêm informações de paginação.

$expand aninhado com relacionamentos N:N

Quando uma propriedade de navegação com valor de coleção representa uma relação N:N, você recebe o seguinte erro ao usar instruções aninhadas $expand :

{
   "error": {
      "code": "0x80060888",
      "message": "The navigation property '<NAME>' cannot be expanded. Only many-to-one relationships are supported for nested expansion."
   }
}

Por exemplo, usando a tabela Dynamics Lead, que tem uma contactleads_association relação N:N com a tabela de contatos, a consulta a seguir retorna o erro porque inclui ;$expand=createdby.

GET [Organization URI]/contacts?$select=fullname$expand=contactleads_association($select=fullname;$expand=createdby)

Para evitar esse erro, construa a consulta usando FetchXml. Por exemplo:

<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>

Saiba mais sobre como unir tabelas usando relações muitos para muitos com FetchXml

Próximas etapas

Saiba como ordenar linhas.