retrieveMultipleRecords (Referenca klijentskog API-ja)

Preuzima kolekciju zapisa tabele.

Sintaksa

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

Parametri

Ime Type Potrebne Opis
entityLogicalName String Da Logičko ime tabele zapisa koje želite da preuzmete. Na primer: account.
options String Ne Opcije sistemskog upita za OData ili FetchXML upit za preuzimanje podataka. Pogledajte opcije
maxPageSize Broj Ne Navedite pozitivan broj koji ukazuje na broj zapisa tabele koji će biti vraćeni po stranici. Ako ne navedete ovaj parametar, vrednost će biti podrazumevana na maksimalno ograničenje od 5000 zapisa za standardne tabele, 500 za elastične tabele.

Ako je broj maxPageSize zapisa koji se preuzimaju veći od navedene vrednosti ili maksimalnog ograničenja za tip tabele, nextLink kolona u vraćenim obećanim objektu će sadržati vezu za preuzimanje zapisa.
successCallback Function Ne Funkcija za pozivanje kada se preuzimaju zapisi tabele. Pogledajte povratnu vrednost
errorCallback Function Ne Funkcija za pozivanje kada operacija ne uspe. Prosleđen je objekat sa sledećim svojstvima:
- errorCode:Broj. Kôd greške kao pozitivan decimalni broj. Na primer, kôd greške koji je dokumentovan kao 0x80040333 će biti vraćen kao 2147746611.
- message:Niske. Poruka o grešci koja opisuje problem.

Opcije

Podržane su sledeće opcije sistemskog upita: $select, $top, $filter, , $expandi $orderby.

Koristite opciju $expand za sistemski upit da biste kontrolisali koji podaci se dobijaju iz srodnih tabela. Ako samo uključite ime svojstva navigacije, primićete sva svojstva za povezane zapise. Možete da ograničite vraćena svojstva za povezane zapise $select pomoću opcije sistemskog upita u zagradama posle imena svojstva navigacije. Koristite ovo i za navigacijske osobine sa jednom vrednošću i za kolekciju. Imajte na umu da za vanmrežnu opciju podržavamo samo ugnežđenu $select opciju unutar $expand.

Da biste naveli upit za dobavljanjeXML-a, koristite kolonu fetchXml da biste naveli upit.

Belešku

Uvek morate da koristite $selectopciju sistemskog upita da biste ograničili svojstva vraćena za zapis tabele tako što ćete uključiti listu imena svojstava razdvojenih zarezima. Ovo je važna najbolja praksa performansi. Ako svojstva nisu navedena pomoću $select, sva svojstva će biti vraćena.

Vi odredite opcije upita počevši od ?. Možete da navedete i više opcija sistemskih upita pomoću za & razdvajanje opcija upita.

Kada navedete OData nisku upita za options parametar, upit bi trebalo da bude kodiran za specijalne znakove.

Kada navedete fetchXML upit za parametar options , upit ne bi trebalo da bude kodiran.

Pogledajte primere da biste videli kako možete da definišete parametar options za različite načine preuzimanja više scenarija.

Povratna vrednost

Pri uspehu vraća obećani objekat sa successCallback sledećim svojstvima:

Ime Type Opis
entities Niz JSON objekata Svaki objekat predstavlja preuzeti zapis tabele koji sadrži kolone i njihove vrednosti kao key: value parove. ID zapisa tabele se podrazumevano preuzima
nextLink String (opcionalno) Ako je broj zapisa koji maxPageSize se preuzimaju veći od vrednosti navedene u parametru u zahtevu, to daje URL adresu koja vraća sledeću stranicu zapisa.
fetchXmlPagingCookie (opcionalno) Za operaciju zasnovanu na funkciji fetchXml retrieveMultipleRecords sa straničnim stranicama gde je ukupan broj zapisa veći od vrednosti straničnih stranica, ovaj atribut vraća kolačić straniča koji se može koristiti za narednu operaciju dobavljanjaXml za preuzimanje sledeće stranice zapisa.

Nepodržani tipovi atributa za opcije upita OData u mobilnom vanmrežnom sistemu

Sledeći tipovi kolona nisu podržani Xrm.WebApi.retrieveMultipleRecords prilikom operacije sa opcijama OData niske upita (na primer, $select$filteri ) u režimu rada van mreže za mobilne uređaje. Trebalo bi da koristite FetchXML ako se tip atributa sa kojima treba da radite nalazi na ovoj listi nepodržanih tipova atributa.

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

Nepodržane funkcije u mobilnoj mreži van mreže

Sledeće funkcije nisu podržane u aplikaciji Mobile Offline:

  • Funkcije grupisanja i agregacije

Podržane operacije filtriranja po tipu atributa u mobilnom telefonu van mreže pomoću funkcije FetchXML

Sledeće operacije su podržane za sve tipove atributa prilikom rada sa funkcijom FetchXML:

  • Jednako (eq)
  • Nije jednako (neq)
  • Bez vrednosti (null)
  • Not Null (not-null)

Sledeća tabela navodi više operacija podržanih za svaki tip atributa:

Tip atributa Podržane operacije
BigInt, Decimal, Double, Integer Veće od (gt)
Veće od ili jednako (gte)
Manje od (lt)
Manje od ili jednako (lte)
Bulov, klijent U (in)
Nije u (not-in)
EntityName, Picklist, State, Status Sviđa mi se (like)
Not Like (not-like)
Počinje sa (begins-with)
Ne počinje sa (not-begin-with)
Završava se sa (ends-with)
Ne završava se sa (not-end-with)
U (in)
Nije u (not-in)
GUID, pronalaženje U (in)
Nije u (not-in)
Jednako korisničkom ID-u (eq-userid)
Nije jednako korisničkom ID-u (ne-userid)
Novac Veće od (gt)
Veće od ili jednako (gte)
Manje od (lt)
Manje od ili jednako (lte)
U (in)
Nije u (not-in)
Vlasnik U (in)
Nije u (not-in)
Jednako korisničkom ID-u (eq-userid)
Nije jednako korisničkom ID-u (ne-userid)
Jednako korisniku ili timu (eq-useroruserteams)
String Sviđa mi se (like)
Not Like (not-like)
Počinje sa (begins-with)
Ne počinje sa (not-begin-with)
Završava se sa (ends-with)
Ne završava se sa (not-end-with)
DateTime Ne pre (on-or-after)
Na (on)
Ne pre (on-or-before)
Danas (today)
Sutra (tomorrow)
Juče (yesterday)
Sledećih sedam dana (next-seven-days)
Poslednjih sedam dana (last-seven-days)
Sledeća sedmica (next-week)
Prošle sedmice (last-week)
Ove sedmice (this-week)
Sledeći mesec (next-month)
Prošlog meseca (last-month)
Ovog meseca (this-month)
Sledeća godina (next-year)
Prošle godine (last-year)
Ove godine (this-year)
Poslednjih X dana (last-x-days)
Sledeći X dana (next-x-days)
Poslednjih X sedmica (last-x-weeks)
Sledećih X sedmica (next-x-weeks)
Poslednjih X meseci (last-x-months)
SledećiH X meseci (next-x-months)
Poslednjih X godina (last-x-years)
Sledećih X godina (next-x-years)
Veće od (gt)
Veće od ili jednako (gte)
Manje od (lt)
Manje od ili jednako (lte)

Primeri

Većina scenarija/primera pomenutih u podacima upita pomoću veb API-ja može se postići pomoću metoda "retrieveMultipleRecords ". Neki od primera su navedeni ispod.

Osnovno preuzimanje višestrukih

Ovaj primer upituje skup tabele naloga $select$top i koristi opcije za sistemski upit kako bi vratio svojstvo imena za prva tri naloga:

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

Ovaj primer upitima za entitet account pomoću dobavljanjaXML-a.

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

Preuzmi ili filtriraj po svojstvima za pronalaženje

Za većinu svojstava navigacije sa jednom vrednošću pronaći ćete svojstvo samo za čitanje koje koristi sledeću konvenciju imenovanja: _<name>_value<name> gde je ime svojstva navigacije sa jednom vrednošću. U svrhe filtriranja može da se koristi i određena vrednost svojstva navigacije sa jednom vrednošću. Međutim, za mobilne klijente u režimu van mreže ove opcije sintakse nisu podržane i ime svojstva navigacije sa jednom vrednošću trebalo bi da se koristi za preuzimanje i filtriranje. Pored toga, poređenje svojstava navigacije sa nulom nije podržano u režimu van mreže.

Više informacija: svojstva za pronalaženje

Evo primera koda za oba scenarija:

Za scenario na mreži (povezan sa serverom)

Ovaj primer upituje $select$filter skup tabela naloga i koristi opcije sistemskog upita da bi vratio ime i primarno svojstvo za naloge koji imaju određeni primarni kontakt:

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

Za mobilni scenario van mreže

Ovaj primer $select$filter upituje tabelu naloga koja je postavljena i koristi opcije za sistemski upit kako bi dala ime i primarno svojstvo za naloge koji imaju određeni primarni kontakt kada radite u režimu van mreže:

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

Korišćenje alatke "FetchXML" za preuzimanje ili filtriranje po svojstvima za pronalaženje (scenario na mreži i van mreže)

Parametar možete da koristite FetchXML dok nameprimarycontactid ste na mreži ili van mreže da biste preuzeli i svojstvo za zapise naloga koji imaju primarni kontakt koji se podudara sa uslovom:

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

Navedite broj tabela koje treba vratiti na stranici

Sledeći primer pokazuje upotrebu parametra maxPageSize za navođenje broja zapisa (3) koji će biti prikazani na stranici.

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

Ovaj primer prikazuje tri zapisa i vezu ka sledećoj stranici. Evo primera rezultata iz konzole u alatkama za programere pregledača:

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

Koristite deo upita u URL nextLinkoptions adresi u svojstvu kao vrednost za parametar u narednom pozivu za preuzimanjeMultipleRecords da biste zahtevali sledeći skup zapisa. Ne menjajte niti dodajte dodatne opcije za sistemski upit vrednosti. Za svaki naredni zahtev za više stranica trebalo maxPageSize bi da koristite istu vrednost korišćenu u originalu za preuzimanje više zahteva. Pored toga, keširajte dobijene rezultate ili vrednost svojstva nextLink kako bi prethodno preuzete stranice bile vraćene.

Na primer, da bismo dobili sledeću stranicu sa zapisima, nextLink u deo upita URL-a ćemo preneti parametar 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
    }
);

Ovo će vratiti sledeću stranicu skupa rezultata:

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

Važno

Vrednost svojstva je nextLink URI kodirana. Ako URI kodiraj vrednost pre nego što je pošaljete, informacije o XML kolačićima u URL adresi će dovesti do greške.

FetchXML primer (scenario na mreži)

Sledeći primer pokazuje count upotrebu parametra fetchXML za navođenje broja zapisa (3) koji će biti prikazani na stranici.

Belešku

FetchXML kolačić straničica se vraća samo za operacije na retrieveMultipleRecords mreži. (Xrm.WebApi.online). Nije podržana van mreže.

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

Ovaj primer će prikazati tri zapisa i vratiti FetchXML kolačić straničad da bi preuzeo rezultate sledeće stranice ako postoji više zapisa koji pripadaju skupu rezultata. Evo primera rezultata iz konzole u alatkama za programere pregledača:

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

Možemo da koristimo kao fetchXmlPagingCookie što je prikazano u dolenavedenom primeru za dobavljanje velikih skupova rezultata straniče.

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

Koristite opciju $expand u svojstvima navigacije da biste kontrolisali podatke koji se vraćaju iz povezanih tabela. Sledeći primer pokazuje kako da preuzmete kontakt za sve zapise naloga. Za povezane zapise o kontaktima preuzimamo samo 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
    }
);

Gorenavedeni deo koda daje rezultat sa šemom kao što je:

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

Belešku

Slično scenariju na mreži, koristite opciju $expand upit sistema da biste preuzeli podatke iz srodnih tabela van mreže. Međutim, relacije više-prema-više nisu podržane u vanmrežnom režimu.

Zastareo metod za mobilni scenario van mreže

Belešku

Zastarelo @odata.nextLink je za mobilne scenarije van mreže. Iako je i dalje podržana za postojeća prilagođavanja, više se ne preporučuje da ga koristite.

Vanmrežna@odata.nextLink $expand vraća belešku koja sadrži informacije o tome kako da pristupite informacijama o srodnom zapisu. Koristimo id, i entityTypeparametar options te beleške da bismo konstruisali neke dodatne Xrm.WebApi.offline.retrieveRecord zahteve. Sledeći deo koda pruža kompletan primer kako to da uradite:

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

Više primera preuzimanja više zapisa pomoću Veb API-ja potražite u članku Podaci upita pomoću veb API-ja.

Upitni podaci pomoću Veb API-ja
Xrm.WebApi.retrieveRecord
Xrm.WebApi