Partajați prin


retrieveMultipleRecords (referință API client)

Regăsește o colecție de înregistrări de tabel.

Sintaxă

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

Parametri

Nume Tipul Obligatoriu Descriere
entityLogicalName Șir Da Numele logic al tabelului pentru înregistrările pe care doriți să le regăsiți. De exemplu: account.
options Șir Nu Opțiunile de interogare a sistemului OData sau interogarea PreluareXML pentru a regăsi datele. Vedeți opțiunile
maxPageSize Număr Nu Specificați un număr pozitiv care indică numărul de înregistrări de tabel de returnat pe pagină. Dacă nu specificați acest parametru, valoarea este implicită la limita maximă de 5.000 de înregistrări pentru tabele standard, 500 pentru tabele elastice.

Dacă numărul de înregistrări regăsite este mai mare decât valoarea specificată maxPageSize sau limita maximă pentru tipul de tabel, nextLink coloana din obiectul promisiune returnat va conține un link pentru a regăsi înregistrările.
successCallback Funcţie Nu O funcție de apelat atunci când sunt regăsite înregistrările tabelului. Consultați Valoarea returnată
errorCallback Funcţie Nu O funcție de apelat atunci când operațiunea eșuează. Se transmite un obiect cu următoarele proprietăți:
- errorCode:Număr. Codul de eroare ca număr zecimal pozitiv. De exemplu, codul de eroare documentat ca 0x80040333 va fi returnat ca 2147746611.
- message:Șir. Un mesaj de eroare care descrie problema.

Opţiuni

Sunt acceptate următoarele opțiuni de interogare de sistem: $select, $top, $filter, $expand, și $orderby.

Utilizați opțiunea de interogare de $expand sistem pentru a controla ce date din tabelele asociate sunt returnate. Dacă includeți doar numele proprietății de navigare, veți primi toate proprietățile pentru înregistrările asociate. Puteți limita proprietățile returnate pentru înregistrările asociate utilizând opțiunea $select de interogare a sistemului între paranteze după numele proprietății de navigare. Utilizați această opțiune atât pentru proprietățile de navigare cu o singură valoare , cât și pentru cele cu valoare de colecție . Rețineți că, pentru offline, acceptăm doar opțiunea $expandimbricată $select din .

Pentru a specifica o interogare FetchXML, utilizați fetchXml coloana pentru a specifica interogarea.

Notă

Trebuie să utilizați întotdeauna opțiunea $selectde interogare de sistem pentru a limita proprietățile returnate pentru o înregistrare de tabel, incluzând o listă separată prin virgulă de nume de proprietăți. Aceasta este o bună practică importantă de performanță. Dacă proprietățile nu sunt specificate utilizând $select, se vor returna toate proprietățile.

Specificați opțiunile de interogare începând cu ?. De asemenea, puteți specifica mai multe opțiuni de interogare de sistem, utilizând & pentru a separa opțiunile de interogare.

Când specificați un șir de interogare OData pentru options parametru, interogarea trebuie codificată pentru caractere speciale.

Când specificați o interogare FetchXML pentru options parametru, interogarea nu trebuie codificată.

Consultați Exemple pentru a vedea cum puteți defini options parametrul pentru diverse scenarii multiple.

Valoare returnată

La succes, returnează un obiect promisiune către successCallback următoarele proprietăți:

Nume Tipul Descriere
entities Matrice de obiecte JSON Fiecare obiect reprezintă înregistrarea de tabel regăsită care conține coloane și valorile lor ca key: value perechi. ID-ul înregistrării tabelului este regăsit în mod implicit
nextLink Șir (opțional) Dacă numărul de înregistrări regăsite este mai mare decât valoarea specificată în maxPageSize parametrul din solicitare, aceasta returnează URL-ul pentru a returna următoarea pagină de înregistrări.
fetchXmlPagingCookie (opțional) Pentru o operațiune bazată pe retrieveMultipleRecords preluareXml cu paginare în care numărul total de înregistrări este mai mare decât valoarea de paginare, acest atribut returnează modulul cookie de paginare care poate fi utilizat pentru o operațiune ulterioară de preluareXml pentru a regăsi următoarea pagină de înregistrări.

Tipuri de atribute neacceptate pentru opțiunile de interogare OData în Mobile Offline

Următoarele tipuri de coloane nu sunt acceptate atunci când efectuați o Xrm.WebApi.retrieveMultipleRecords operațiune cu opțiunile de șir de interogare OData (de exemplu, $select și $filter) în modul offline mobil. Trebuie să utilizați FetchXML dacă tipul de atribut cu care trebuie să lucrați se află în această listă de tipuri de atribute neacceptate.

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

Caracteristici neacceptate în Mobile Offline

Următoarele caracteristici nu sunt acceptate în Mobile Offline:

  • Caracteristici de grupare și agregare

Operațiuni de filtrare acceptate per tip de atribut în mobil offline utilizând FetchXML

Următoarele operațiuni sunt acceptate pentru toate tipurile de atribute atunci când lucrați cu FetchXML:

  • Este egal cu (eq)
  • Nu este egal cu (neq)
  • Nul (null)
  • Nu este nul (not-null)

Următorul tabel listează mai multe operațiuni acceptate pentru fiecare tip de atribut:

Tip atribut Operațiuni acceptate
BigInt, zecimal, dublu, întreg Mai mare decât (gt)
Mai mare sau egal cu (gte)
Mai mic decât (lt)
Mai mic sau egal cu (lte)
Boolean, client În (in)
Nu este în (not-in)
EntityName, Selector, Stare, Stare Like (like)
Nu îmi place (not-like)
Începe cu (begins-with)
Nu începe cu (not-begin-with)
Se termină cu (ends-with)
Nu se termină cu (not-end-with)
În (in)
Nu este în (not-in)
GUID, Căutare În (in)
Nu este în (not-in)
Este egal cu ID-ul de utilizator (eq-userid)
Nu este egal cu ID-ul de utilizator (ne-userid)
Money Mai mare decât (gt)
Mai mare sau egal cu (gte)
Mai mic decât (lt)
Mai mic sau egal cu (lte)
În (in)
Nu este în (not-in)
Proprietar În (in)
Nu este în (not-in)
Este egal cu ID-ul de utilizator (eq-userid)
Nu este egal cu ID-ul de utilizator (ne-userid)
Este egal cu utilizatorul sau echipa (eq-useroruserteams)
Șir Like (like)
Nu îmi place (not-like)
Începe cu (begins-with)
Nu începe cu (not-begin-with)
Se termină cu (ends-with)
Nu se termină cu (not-end-with)
DateTime La Sau după (on-or-after)
La (on)
La sau înainte (on-or-before)
Astăzi (today)
Mâine (tomorrow)
Ieri (yesterday)
Următoarele șapte zile (next-seven-days)
Ultimele șapte zile (last-seven-days)
Săptămâna viitoare (next-week)
Săptămâna trecută (last-week)
Săptămâna aceasta (this-week)
Luna următoare (next-month)
Luna trecută (last-month)
Luna aceasta (this-month)
Anul următor (next-year)
Anul trecut (last-year)
Anul acesta (this-year)
Ultimele X zile (last-x-days)
Următoarele X zile (next-x-days)
Ultimele X săptămâni (last-x-weeks)
Următoarele X săptămâni (next-x-weeks)
Ultimele X luni (last-x-months)
Următoarele X luni (next-x-months)
Ultimii X ani (last-x-years)
Următorii X ani (next-x-years)
Mai mare decât (gt)
Mai mare sau egal (gte)
Mai mic decât (lt)
Mai mic sau egal (lte)

Exemple

Majoritatea scenariilor/exemplelor menționate în Datele de interogare utilizând API-ul web pot fi realizate utilizând metoda retrieveMultipleRecords . Unele dintre exemple sunt listate mai jos.

Regăsire de bază multiplă

Acest exemplu interoghează setul de tabele de conturi și utilizează $select opțiunile de interogare de sistem pentru $top a returna proprietatea nume pentru primele trei conturi:

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
    }
);

Basic retrieve multiple with FetchXML

Acest exemplu interoghează entitatea account utilizând preluareXML.

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
    }
);

Regăsiți sau filtrați după proprietățile de căutare

Pentru majoritatea proprietăților de navigare cu valoare unică, veți găsi o proprietate calculată, doar în citire, care utilizează următoarea convenție de denumire: _<name>_value unde <name> este numele proprietății de navigare cu valoare unică. În scopuri de filtrare, se poate utiliza și valoarea specifică a proprietății de navigare cu valoare unică. Cu toate acestea, pentru clienții mobili în modul offline, aceste opțiuni de sintaxă nu sunt acceptate, iar numele proprietății de navigare cu valoare unică trebuie utilizat atât pentru regăsire, cât și pentru filtrare. De asemenea, comparația proprietăților de navigare cu null nu este acceptată în modul offline.

Mai multe informații: Proprietăți de căutare

Iată exemple de cod pentru ambele scenarii:

Pentru scenariul online (conectat la server)

Acest exemplu interoghează setul de conturi și utilizează $select opțiunile de interogare de sistem pentru $filter a returna proprietatea nume și contactid primară pentru conturile care au o anumită persoană de contact principală:

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
    }
);

Scenariul pentru dispozitive mobile offline

Acest exemplu interoghează setul de tabele ale conturilor și utilizează $select$filter opțiunile de interogare de sistem pentru a returna proprietatea nume și contactid primară pentru conturile care au o anumită persoană de contact principală atunci când lucrați în modul offline:

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
    }
);

Utilizarea FetchXML pentru a regăsi sau a filtra după proprietățile de căutare (scenariu online și offline)

Puteți utiliza parametrul FetchXML în timp ce sunteți online sau offline pentru a regăsi name proprietatea și primarycontactid pentru înregistrările de cont care au o persoană de contact principală care se potrivește cu o condiție:

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
    }
);

Specificați numărul de tabele de returnat într-o pagină

Următorul exemplu demonstrează utilizarea parametrului maxPageSize pentru a specifica numărul de înregistrări (3) de afișat într-o pagină.

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
    }
);

Acest exemplu va afișa trei înregistrări și un link la pagina următoare. Iată un exemplu de ieșire din consolă în instrumentele pentru dezvoltatorii browserului:

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

Utilizați partea de interogare din URL-ul din nextLink proprietate ca valoare pentru parametrul din apelul RegăsireMultipleRecords ulterior pentru options a solicita următorul set de înregistrări. Nu modificați și nu adăugați alte opțiuni de interogare de sistem la valoare. Pentru fiecare solicitare ulterioară pentru mai multe pagini, ar trebui să utilizați aceeași maxPageSize valoare utilizată în solicitarea inițială regăsiți mai multe. De asemenea, se memorează în cache rezultatele returnate sau valoarea proprietății nextLink, astfel încât paginile regăsite anterior să poată fi returnate.

De exemplu, pentru a obține următoarea pagină de înregistrări, vom transmite în partea de nextLink interogare a URL-ului parametrului options :

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
    }
);

Aceasta va returna următoarea pagină a setului de rezultate:

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

Important

Valoarea proprietății nextLink este codificată CU URI. Dacă URI codifică valoarea înainte de a o trimite, informațiile despre modulul cookie XML din URL vor provoca o eroare.

Exemplu preluareXML (scenariu online)

Următorul exemplu demonstrează utilizarea count parametrului FetchXML pentru a specifica numărul de înregistrări (3) de afișat într-o pagină.

Notă

Modulul cookie de paginare PreluareXML este returnat doar pentru operațiuni online retrieveMultipleRecords . (Xrm.WebApi.online). Nu este acceptat offline.

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
    }
);

Acest exemplu va afișa trei înregistrări și va returna un Modul cookie de paginare PreluareXML pentru a regăsi rezultatele paginii următoare dacă există mai multe înregistrări care aparțin setului de rezultate. Iată un exemplu de ieșire din consolă în instrumentele pentru dezvoltatorii browserului:

{
   "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\" />"
}

Putem utiliza fetchXmlPagingCookie așa cum se arată în exemplul de mai jos pentru a prelua seturi mari de rezultate cu paginare.

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
  }
);

Utilizați opțiunea $expand interogare de sistem din proprietățile de navigare pentru a controla datele returnate din tabelele asociate. Următorul exemplu arată cum să regăsiți persoana de contact pentru toate înregistrările contului. Pentru înregistrările de persoane de contact asociate, regăsim doar și contactidfullname:

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
    }
);

Fragmentul de cod de mai sus returnează un rezultat cu o schemă, cum ar fi:

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

Notă

Similar cu scenariul online, utilizați opțiunea de interogare de sistem $expand pentru a regăsi date din tabelele asociate offline. Totuși, relațiile mai-mulți-la-mai-mulți nu sunt acceptate offline.

Metodă perimată pentru scenariul mobil offline

Notă

Este @odata.nextLink perimat pentru scenariile mobile offline. Deși este încă acceptat pentru particularizările existente, nu se recomandă să-l mai utilizați.

O operațiune de $expand offline returnează o @odata.nextLink adnotare care conține informații despre cum să ajungeți la informațiile înregistrării asociate. Utilizăm idparametrul , entityTypeși options parametrul acestei adnotări pentru a construi una sau mai multe solicitări suplimentare Xrm.WebApi.offline.retrieveRecord . Următorul fragment de cod oferă un exemplu complet despre cum să procedați:

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
});

Pentru mai multe exemple de regăsire a mai multor înregistrări utilizând API-ul web, consultați Interogarea datelor utilizând API-ul web.

Interogarea datelor utilizând API-ul web
Xrm.WebApi.retrieveRecord
Xrm.WebApi