Delen via


retrieveMultipleRecords (client-API-verwijzing)

Hiermee haalt u een verzameling tabelrecords op.

Syntaxis

Xrm.WebApi.retrieveMultipleRecords(entityLogicalName, options, maxPageSize).then(successCallback, errorCallback);

Parameterwaarden

Naam Typologie Verplicht Description
entityLogicalName Snaar / Touwtje Yes De logische tabelnaam van de records die u wilt ophalen. Voorbeeld: account.
options Snaar / Touwtje Nee. OData-systeemqueryopties of FetchXML-query om uw gegevens op te halen. Opties weergeven
maxPageSize Number Nee. Geef een positief getal op dat het aantal tabelrecords aangeeft dat per pagina moet worden geretourneerd. Als u deze parameter niet opgeeft, wordt de waarde standaard ingesteld op de maximumlimiet van 5000 records voor standaardtabellen, 500 voor elastische tabellen.

Als het aantal records dat wordt opgehaald meer is dan de opgegeven maxPageSize waarde of de maximumlimiet voor het tabeltype, bevat de nextLink kolom in het geretourneerde promise-object een koppeling om records op te halen.
successCallback Functie Nee. Een functie die moet worden aangeroepen wanneer tabelrecords worden opgehaald. Zie Retourwaarde
errorCallback Functie Nee. Een functie om aan te roepen wanneer de bewerking mislukt. Er wordt een object met de volgende eigenschappen doorgegeven:
- errorCode:Getal. De foutcode als een positief decimaal getal. De foutcode die wordt beschreven zoals 0x80040333 wordt geretourneerd als 2147746611.
- message:Snaar. Een foutmelding die het probleem beschrijft.

Options

De volgende opties voor systeemquery's worden ondersteund: , , , en $orderby$expand. $filter$top$select

Gebruik de $expand systeemqueryoptie om te bepalen welke gegevens uit gerelateerde tabellen worden geretourneerd. Als u alleen de naam van de navigatie-eigenschap opneemt, ontvangt u alle eigenschappen voor gerelateerde records. U kunt de eigenschappen die worden geretourneerd voor gerelateerde records beperken met behulp van de $select optie systeemquery tussen haakjes na de naam van de navigatie-eigenschap. Gebruik dit voor navigatie-eigenschappen met één of meteen verzamelingswaarde . Houd er rekening mee dat voor offline alleen geneste $select opties in de $expand.

Als u een FetchXML-query wilt opgeven, gebruikt u de fetchXml kolom om de query op te geven.

Opmerking

U moet altijd de $selectsysteemqueryoptie gebruiken om de eigenschappen te beperken die worden geretourneerd voor een tabelrecord door een door komma's gescheiden lijst met eigenschapsnamen op te nemen. Dit is een belangrijke best practice op het gebied van prestaties. Als er geen eigenschappen worden opgegeven met behulp van $select, worden alle eigenschappen geretourneerd.

U geeft de queryopties op die beginnen met ?. U kunt ook meerdere systeemqueryopties opgeven door & de queryopties te scheiden.

Wanneer u een OData-queryreeks voor de options parameter opgeeft, moet de query worden gecodeerd voor speciale tekens.

Wanneer u een FetchXML-query voor de options parameter opgeeft, mag de query niet worden gecodeerd.

Zie Voorbeelden om te zien hoe u de options parameter kunt definiëren voor verschillende scenario's voor het ophalen van meerdere scenario's.

Retourwaarde

Retourneert bij succes een promise-object aan de successCallback hand van de volgende eigenschappen:

Naam Typologie Description
entities Matrix van JSON-objecten Elk object vertegenwoordigt de opgehaalde tabelrecord met kolommen en de bijbehorende waarden als key: value paren. De id van de tabelrecord wordt standaard opgehaald
nextLink Snaar / Touwtje (optioneel) Als het aantal records dat wordt opgehaald meer is dan de waarde die is opgegeven in de maxPageSize parameter in de aanvraag, retourneert dit de URL om de volgende pagina met records te retourneren.
fetchXmlPagingCookie (optioneel) Voor een op fetchXml gebaseerde retrieveMultipleRecords bewerking met paginering waarbij het totale aantal records groter is dan de pagineringswaarde, retourneert dit kenmerk de pagineringscookor die kan worden gebruikt voor een volgende fetchXml-bewerking om de volgende pagina met records op te halen.

Niet-ondersteunde kenmerktypen voor OData-queryopties in Offline mobiel

De volgende kolomtypen worden niet ondersteund bij het uitvoeren van een Xrm.WebApi.retrieveMultipleRecords bewerking met OData-queryreeksopties (bijvoorbeeld $select en $filter) in de offlinemodus voor mobiele apparaten. Gebruik FetchXML als het kenmerktype waarmee u moet werken zich in deze lijst met niet-ondersteunde kenmerktypen bevindt.

  • MultiSelectPicklist
  • File
  • Image
  • ManagedProperty
  • CalendarRules
  • PartyList
  • Virtual

Niet-ondersteunde functies in Mobile Offline

De volgende functies worden niet ondersteund in Mobile Offline:

  • Groeperings- en aggregatiefuncties

Ondersteunde filterbewerkingen per kenmerktype in Mobile Offline met fetchXML

De volgende bewerkingen worden ondersteund voor alle kenmerktypen wanneer u met FetchXML werkt:

  • Is gelijk aan (eq)
  • Niet gelijk aan (neq)
  • Null (null)
  • Niet Null (not-null)

De volgende tabel bevat meer bewerkingen die worden ondersteund voor elk kenmerktype:

Type kenmerk Ondersteunde bewerkingen
BigInt, Decimaal, Dubbel, Geheel getal Groter dan (gt)
Groter dan of gelijk aan (gte)
Kleiner dan (lt)
Kleiner dan of gelijk aan (lte)
Booleaanse waarde, klant In (in)
Niet in (not-in)
EntityName, Picklist, State, Status Vind ik leuk (like)
Niet leuk (not-like)
Begint met (begins-with)
Niet beginnen met (not-begin-with)
Eindigt met (ends-with)
Niet eindigen met (not-end-with)
In (in)
Niet in (not-in)
Guid, Opzoeken In (in)
Niet in (not-in)
Is gelijk aan gebruikers-id (eq-userid)
Is niet gelijk aan gebruikers-id (ne-userid)
Geld Groter dan (gt)
Groter dan of gelijk aan (gte)
Kleiner dan (lt)
Kleiner dan of gelijk aan (lte)
In (in)
Niet in (not-in)
Eigenaar In (in)
Niet in (not-in)
Is gelijk aan gebruikers-id (eq-userid)
Is niet gelijk aan gebruikers-id (ne-userid)
Is gelijk aan gebruiker of team (eq-useroruserteams)
Snaar / Touwtje Vind ik leuk (like)
Niet leuk (not-like)
Begint met (begins-with)
Niet beginnen met (not-begin-with)
Eindigt met (ends-with)
Niet eindigen met (not-end-with)
DateTime Aan of na (on-or-after)
Op (on)
Op of voor (on-or-before)
Vandaag (today)
Morgen (tomorrow)
Gisteren (yesterday)
Volgende zeven dagen (next-seven-days)
Afgelopen zeven dagen (last-seven-days)
Volgende week (next-week)
Vorige week (last-week)
Deze week (this-week)
Volgende maand (next-month)
Vorige maand (last-month)
Deze maand (this-month)
Volgend jaar (next-year)
Vorig jaar (last-year)
Dit jaar (this-year)
Afgelopen X dagen (last-x-days)
Volgende x dagen (next-x-days)
Afgelopen X weken (last-x-weeks)
Volgende x weken (next-x-weeks)
Afgelopen X maanden (last-x-months)
Volgende x maanden (next-x-months)
Afgelopen X jaar (last-x-years)
Volgende x jaar (next-x-years)
Groter dan (gt)
Groter dan of gelijk aan (gte)
Kleiner dan (lt)
Kleiner dan of gelijk aan (lte)

Voorbeelden

De meeste scenario's/voorbeelden die worden vermeld in Querygegevens met behulp van de web-API , kunnen worden bereikt met behulp van de methode retrieveMultipleRecords . Hieronder vindt u enkele voorbeelden.

Eenvoudig ophalen van meerdere

In dit voorbeeld wordt een query uitgevoerd op de accountstabelset en worden de $select opties voor $top systeemquery's gebruikt om de naameigenschap voor de eerste drie accounts te retourneren:

Xrm.WebApi.retrieveMultipleRecords("account", "?$select=name&$top=3").then(
    function success(result) {
        for (var i = 0; i < result.entities.length; i++) {
            console.log(result.entities[i]);
        }                    
        // perform additional operations on retrieved records
    },
    function (error) {
        console.log(error.message);
        // handle error conditions
    }
);

Eenvoudig meerdere ophalen met FetchXML

In dit voorbeeld wordt een query uitgevoerd op de account entiteit met behulp van fetchXML.

var fetchXml = "?fetchXml=<fetch><entity name='account'><attribute name='accountid'/><attribute name='name'/></entity></fetch>";

Xrm.WebApi.retrieveMultipleRecords("account", fetchXml).then(
    function success(result) {
        for (var i = 0; i < result.entities.length; i++) {
            console.log(result.entities[i]);
        }                    

        // perform additional operations on retrieved records
    },
    function (error) {
        console.log(error.message);
        // handle error conditions
    }
);

Ophalen of filteren op opzoekeigenschappen

Voor de meeste navigatie-eigenschappen met één waarde vindt u een berekende, alleen-lezen eigenschap die gebruikmaakt van de volgende naamconventie: _<name>_value waarbij de <name> naam van de navigatie-eigenschap met één waarde is. Voor filterdoeleinden kan ook de specifieke waarde van de navigatie-eigenschap met één waarde worden gebruikt. Voor mobiele clients in de offlinemodus worden deze syntaxisopties echter niet ondersteund en moet de naam van de navigatie-eigenschap met één waarde worden gebruikt voor het ophalen en filteren. De vergelijking van navigatie-eigenschappen met null wordt ook niet ondersteund in de offlinemodus.

Meer informatie: Opzoekeigenschappen

Hier volgen codevoorbeelden voor beide scenario's:

Voor onlinescenario (verbonden met server)

In dit voorbeeld wordt een query uitgevoerd op de accountstabelset en worden de $select$filter opties voor systeemquery's gebruikt om de eigenschap name en primarycontactid te retourneren voor accounts met een bepaalde primaire contactpersoon:

Xrm.WebApi.retrieveMultipleRecords("account", "?$select=name,_primarycontactid_value&$filter=primarycontactid/contactid eq a0dbf27c-8efb-e511-80d2-00155db07c77").then(
    function success(result) {
        for (var i = 0; i < result.entities.length; i++) {
            console.log(result.entities[i]);
        }                    
        // perform additional operations on retrieved records
    },
    function (error) {
        console.log(error.message);
        // handle error conditions
    }
);

Voor mobiel offlinescenario

In dit voorbeeld wordt een query uitgevoerd op de accountstabelset en worden de opties voor $filter systeemquery's $select gebruikt om de eigenschap name en primarycontactid te retourneren voor accounts die een bepaalde primaire contactpersoon hebben bij het werken in de offlinemodus:

Xrm.WebApi.retrieveMultipleRecords("account", "?$select=name,primarycontactid&$filter=primarycontactid eq a0dbf27c-8efb-e511-80d2-00155db07c77").then(
    function success(result) {
        for (var i = 0; i < result.entities.length; i++) {
            console.log(result.entities[i]);
        }                    
        // perform additional operations on retrieved records
    },
    function (error) {
        console.log(error.message);
        // handle error conditions
    }
);

FetchXML gebruiken om opzoekeigenschappen op te halen of te filteren (online- en offlinescenario)

U kunt de FetchXML parameter online of offline gebruiken om de name en primarycontactid eigenschap voor accountrecords op te halen die een primaire contactpersoon hebben die overeenkomt met een voorwaarde:

var fetchXml = `?fetchXml=
    <fetch>
       <entity name='account'>
          <attribute name='name'/>
          <attribute name='primarycontactid'/>
          <link-entity name='contact' from='contactid' to='primarycontactid'>
             <filter type='and'>
                <condition attribute='lastname' operator='eq' value='Contoso'/>
             </filter>
          </link-entity>
       </entity>
    </fetch>`;

Xrm.WebApi.retrieveMultipleRecords("account", fetchXml).then(
    function success(result) {
        for (var i = 0; i < result.entities.length; i++) {
            console.log(result.entities[i]);
        }                    

        // perform additional operations on retrieved records
    },
    function (error) {
        console.log(error.message);
        // handle error conditions
    }
);

Geef het aantal tabellen op dat moet worden geretourneerd op een pagina

In het volgende voorbeeld ziet u hoe de parameter wordt gebruikt maxPageSize om het aantal records (3) op te geven dat op een pagina moet worden weergegeven.

Xrm.WebApi.retrieveMultipleRecords("account", "?$select=name", 3).then(
    function success(result) {
        for (var i = 0; i < result.entities.length; i++) {
            console.log(result.entities[i]);
        }
        console.log("Next page link: " + result.nextLink);
        // perform additional operations on retrieved records
    },
    function (error) {
        console.log(error.message);
        // handle error conditions
    }
);

In dit voorbeeld worden drie records en een koppeling naar de volgende pagina weergegeven. Hier volgt een voorbeeld van uitvoer van de Console in de ontwikkelhulpprogramma's van de browser:

{@odata.etag: "W/"1035541"", name: "A. Datum", accountid: "475b158c-541c-e511-80d3-3863bb347ba8"}
@odata.etag: "W/"1035541""accountid: "475b158c-541c-e511-80d3-3863bb347ba8"name: "A. Datum"__proto__: Object
VM5595:4 
{@odata.etag: "W/"947306"", name: "Adventure Works", accountid: "a8a19cdd-88df-e311-b8e5-6c3be5a8b200"}
VM5595:4 
{@odata.etag: "W/"1033754"", name: "Alpine Ski House", accountid: "aaa19cdd-88df-e311-b8e5-6c3be5a8b200"}
VM5595:6 
Next page link: [Organization URI]/api/data/v9.0/accounts?$select=name&$skiptoken=%3Ccookie%20pagenumber=%222%22%20pagingcookie=%22%253ccookie%2520page%253d%25221%2522%253e%253caccountid%2520last%253d%2522%257bAAA19CDD-88DF-E311-B8E5-6C3BE5A8B200%257d%2522%2520first%253d%2522%257b475B158C-541C-E511-80D3-3863BB347BA8%257d%2522%2520%252f%253e%253c%252fcookie%253e%22%20istracking=%22False%22%20/%3E

Gebruik het queryonderdeel in de URL in de nextLink eigenschap als de waarde voor de parameter in de options volgende aanroep retrieveMultipleRecords om de volgende set records aan te vragen. Wijzig of voeg geen systeemqueryopties toe aan de waarde. Voor elke volgende aanvraag voor meer pagina's moet u dezelfde maxPageSize waarde gebruiken die wordt gebruikt in de oorspronkelijke aanvraag om meerdere aanvragen op te halen. Sla ook de geretourneerde resultaten of de waarde van de nextLink-eigenschap in de cache op, zodat eerder opgehaalde pagina's kunnen worden geretourneerd.

Als u bijvoorbeeld de volgende pagina met records wilt ophalen, geven we het querygedeelte van de nextLink URL door aan de options parameter:

Xrm.WebApi.retrieveMultipleRecords("account", "?$select=name&$skiptoken=%3Ccookie%20pagenumber=%222%22%20pagingcookie=%22%253ccookie%2520page%253d%25221%2522%253e%253caccountid%2520last%253d%2522%257bAAA19CDD-88DF-E311-B8E5-6C3BE5A8B200%257d%2522%2520first%253d%2522%257b475B158C-541C-E511-80D3-3863BB347BA8%257d%2522%2520%252f%253e%253c%252fcookie%253e%22%20istracking=%22False%22%20/%3E", 3).then(
    function success(result) {
        for (var i = 0; i < result.entities.length; i++) {
            console.log(result.entities[i]);
        }
        console.log("Next page link: " + result.nextLink);
        // perform additional operations on retrieved records
    },
    function (error) {
        console.log(error.message);
        // handle error conditions
    }
);

Hiermee wordt de volgende pagina van de resultatenset geretourneerd:

{@odata.etag: "W/"1035542"", name: "Blue Yonder Airlines", accountid: "aca19cdd-88df-e311-b8e5-6c3be5a8b200"}
VM5597:4 
{@odata.etag: "W/"1031348"", name: "City Power & Light", accountid: "aea19cdd-88df-e311-b8e5-6c3be5a8b200"}
VM5597:4 
{@odata.etag: "W/"1035543"", name: "Coho Winery", accountid: "b0a19cdd-88df-e311-b8e5-6c3be5a8b200"}
VM5597:6 
Next page link: [Organization URI]/api/data/v9.0/accounts?$select=name&$skiptoken=%3Ccookie%20pagenumber=%223%22%20pagingcookie=%22%253ccookie%2520page%253d%25222%2522%253e%253caccountid%2520last%253d%2522%257bB0A19CDD-88DF-E311-B8E5-6C3BE5A8B200%257d%2522%2520first%253d%2522%257bACA19CDD-88DF-E311-B8E5-6C3BE5A8B200%257d%2522%2520%252f%253e%253c%252fcookie%253e%22%20istracking=%22False%22%20/%3E

Belangrijk

De waarde van de nextLink eigenschap is URI-gecodeerd. Als u de waarde codeert voordat u deze verzendt, veroorzaakt de XML-cookie-informatie in de URL een fout.

FetchXML-voorbeeld (onlinescenario)

In het volgende voorbeeld ziet u hoe de count parameter van FetchXML wordt gebruikt om het aantal records (3) op te geven dat op een pagina moet worden weergegeven.

Opmerking

De cookie FetchXML-paginering wordt alleen geretourneerd voor onlinebewerkingen retrieveMultipleRecords . (Xrm.WebApi.online). Het wordt niet offline ondersteund.

var fetchXml = "?fetchXml=<fetch count='3'><entity name='account'><attribute name='accountid'/><attribute name='name'/></entity></fetch>";

Xrm.WebApi.online.retrieveMultipleRecords("account", fetchXml).then(
    function success(result) {
        for (var i = 0; i < result.entities.length; i++) {
            console.log(result.entities[i]);
        }          

        console.log("Paging cookie: " + result.fetchXmlPagingCookie);

        // perform additional operations on retrieved records
    },
    function (error) {
        console.log(error.message);
        // handle error conditions
    }
);

In dit voorbeeld worden drie records weergegeven en wordt een FetchXML Paging-cookie geretourneerd om de resultaten van de volgende pagina op te halen als er meer records behoren tot de resultatenset. Hier volgt een voorbeeld van uitvoer van de Console in de ontwikkelhulpprogramma's van de browser:

{
   "entities": [
      {
         "@odata.etag": "W/\"1035542\"",
         "accountid": "aca19cdd-88df-e311-b8e5-6c3be5a8b200",
         "name": "Blue Yonder Airlines"
      },
      {
         "@odata.etag": "W/\"1031348\"",
         "accountid": "aea19cdd-88df-e311-b8e5-6c3be5a8b200",
         "name": "City Power & Light"
      },
      {
         "@odata.etag": "W/\"1035543\"",
         "accountid": "b0a19cdd-88df-e311-b8e5-6c3be5a8b200",
         "name": "Coho Winery"
      }
   ],
   "fetchXmlPagingCookie": "<cookie pagenumber=\"2\" pagingcookie=\"%253ccookie%2520page%253d%25221%2522%253e%253caccountid%2520last%253d%2522%257b0748C6EC-55A8-EB11-B1B5-000D3AFEF6FA%257d%2522%2520first%253d%2522%257bFC47C6EC-55A8-EB11-B1B5-000D3AFEF6FA%257d%2522%2520%252f%253e%253c%252fcookie%253e\" istracking=\"False\" />"
}

We kunnen de fetchXmlPagingCookie zoals weergegeven in het onderstaande voorbeeld gebruiken om grote resultatensets met paging op te halen.

function CreateXml(fetchXml, pagingCookie, page, count) {
  var domParser = new DOMParser();
  var xmlSerializer = new XMLSerializer();

  var fetchXmlDocument = domParser.parseFromString(fetchXml, "text/xml");

  if (page) {
    fetchXmlDocument
      .getElementsByTagName("fetch")[0]
      .setAttribute("page", page.toString());
  }

  if (count) {
    fetchXmlDocument
      .getElementsByTagName("fetch")[0]
      .setAttribute("count", count.toString());
  }

  if (pagingCookie) {
    var cookieDoc = domParser.parseFromString(pagingCookie, "text/xml");
    var innerPagingCookie = domParser.parseFromString(
      decodeURIComponent(
        decodeURIComponent(
          cookieDoc
            .getElementsByTagName("cookie")[0]
            .getAttribute("pagingcookie")
        )
      ),
      "text/xml"
    );
    fetchXmlDocument
      .getElementsByTagName("fetch")[0]
      .setAttribute(
        "paging-cookie",
        xmlSerializer.serializeToString(innerPagingCookie)
      );
  }

  return xmlSerializer.serializeToString(fetchXmlDocument);
}

function retrieveAllRecords(entityName, fetchXml, page, count, pagingCookie) {
  if (!page) {
    page = 0;
  }

  return retrievePage(entityName, fetchXml, page + 1, count, pagingCookie).then(
    function success(pageResults) {
      if (pageResults.fetchXmlPagingCookie) {
        return retrieveAllRecords(
          entityName,
          fetchXml,
          page + 1,
          count,
          pageResults.fetchXmlPagingCookie
        ).then(
          function success(results) {
            if (results) {
              return pageResults.entities.concat(results);
            }
          },
          function error(e) {
            throw e;
          }
        );
      } else {
        return pageResults.entities;
      }
    },
    function error(e) {
      throw e;
    }
  );
}

function retrievePage(entityName, fetchXml, pageNumber, count, pagingCookie) {
  var fetchXml =
    "?fetchXml=" + CreateXml(fetchXml, pagingCookie, pageNumber, count);

  return Xrm.WebApi.online.retrieveMultipleRecords(entityName, fetchXml).then(
    function success(result) {
      return result;
    },
    function error(e) {
      throw e;
    }
  );
}

var count = 3;
var fetchXml =
  '<fetch><entity name="account"><attribute name="accountid"/><attribute name="name"/></entity></fetch>';

retrieveAllRecords("account", fetchXml, null, count, null).then(
  function success(result) {
    console.log(result);

    // perform additional operations on retrieved records
  },
  function error(error) {
    console.log(error.message);
    // handle error conditions
  }
);

Gebruik de optie $expand systeemquery in de navigatie-eigenschappen om de gegevens te beheren die worden geretourneerd uit gerelateerde tabellen. In het volgende voorbeeld ziet u hoe u de contactpersoon voor alle accountrecords ophaalt. Voor de gerelateerde contactpersoonrecords worden alleen de contactid en fullname:

Xrm.WebApi.retrieveMultipleRecords("account", "?$select=name&$top=3&$expand=primarycontactid($select=contactid,fullname)", 3).then(
    function success(result) {
        for (var i = 0; i < result.entities.length; i++) {
            console.log(result.entities[i]);
        }        
        // perform additional operations on retrieved records
    },
    function (error) {
        console.log(error.message);
        // handle error conditions
    }
);

Het bovenstaande stukje code retourneert een resultaat met een schema zoals:

{
   "entities": [
      {
         "@odata.etag": "W/\"1459919\"",
         "name": "Test Account",
         "accountid": "119edfac-19c6-ea11-a81a-000d3af5e732",
         "primarycontactid": {
            "contactid": "6c63a1b7-19c6-ea11-a81a-000d3af5e732",
            "fullname": "Test Contact"
         }
      }
   ]
}

Opmerking

Net als bij het onlinescenario gebruikt u de optie $expand systeemquery om gegevens op te halen uit gerelateerde tabellen offline. Veel-op-veel-relaties worden echter niet ondersteund in offline.

Afgeschafte methode voor mobiel offlinescenario

Opmerking

De @odata.nextLink app is afgeschaft voor offlinescenario's voor mobiele apparaten. Hoewel het nog steeds wordt ondersteund voor bestaande aanpassingen, wordt het niet meer aanbevolen om deze te gebruiken.

Een offline -$expand-bewerking retourneert een @odata.nextLink aantekening met informatie over het ophalen van de gegevens van de gerelateerde record. We gebruiken de id, entityTypeen options parameter van die aantekening om een of meer extra Xrm.WebApi.offline.retrieveRecord aanvragen te maken. Het volgende stukje code biedt een volledig voorbeeld van hoe u dit doet:

Xrm.WebApi.offline.retrieveMultipleRecords("account", "?$select=name&$top=3&$expand=primarycontactid($select=contactid,fullname)").then(function(resultSet) {
    /**
     *  resultSet has a structure like:
     *  {
     *      "entities": [
     *          {
     *              "accountid": "119edfac-19c6-ea11-a81a-000d3af5e732",
     *              "name": "Test Account",
     *              "primarycontactid@odata.nextLink": {
     *                  "API": "{Xrm.Mobile.offline}.{retrieveRecord}",
     *                  "id": "119edfac-19c6-ea11-a81a-000d3af5e732",
     *                  "entityType": "account",
     *                  "options": "?$select=accountid&$expand=primarycontactid($select=contactid,fullname)&$getOnlyRelatedEntity=true"
     *              },
     *              "primarycontactid": {}
     *          }
     *      ]
     *  }
     *
     *  Notice the empty `primarycontactid` property but an additional `primarycontactid@odata.nextLink` 
     *  annotation that lets us know how to get to the linked data that we need.
     **/

    var promises = resultSet.entities.map(function(outerItem) {
        // We do a retrieveRecord() for every item in the result set of retrieveMultipleRecords() and then
        // combine the results into the retrieveMultipleRecords() result set itself.
       return Xrm.WebApi.offline.retrieveRecord(
           outerItem["primarycontactid@odata.nextLink"].entityType, 
           outerItem["primarycontactid@odata.nextLink"].id,
           outerItem["primarycontactid@odata.nextLink"].options
        ).then(function(innerResult) {            
            if (innerResult.value.length === 0) {
                return outerItem;
            }
            outerItem.primarycontactid = innerResult.value[0];
            return outerItem;
        });
    });

    return Promise.all(promises);
}).then(function(allResults) {
    for (var i = 0; i < allResults.length; i++) {
        console.log(allResults[i]);
    }
    // perform additional operations on retrieved records
}, function(error) {
    console.error(error);
    // handle error conditions
});

Zie Querygegevens met behulp van de web-API voor meer voorbeelden van het ophalen van meerdere records met behulp van de web-API.

Query's uitvoeren op gegevens met behulp van de web-API
Xrm.WebApi.retrieveRecord
Xrm.WebApi