retrieveMultipleRecords (Referensi API Klien)

Mengambil kumpulan rekaman tabel.

Syntax

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

Parameter-parameternya

Nama Tipe Diperlukan Description
entityLogicalName String Yes Nama logis tabel rekaman yang ingin Anda ambil. Misalnya: account.
options String Tidak. Opsi kueri sistem OData atau kueri FetchXML untuk mengambil data Anda. Lihat Opsi
maxPageSize Number Tidak. Tentukan angka positif yang menunjukkan jumlah rekaman tabel yang akan dikembalikan per halaman. Jika Anda tidak menentukan parameter ini, nilai default adalah batas maksimum 5.000 rekaman untuk tabel standar dan 500 untuk tabel elastis.

Jika jumlah rekaman yang Anda ambil lebih dari nilai yang ditentukan maxPageSize atau batas maksimum untuk jenis tabel, nextLink kolom di objek janji yang dikembalikan berisi tautan untuk mengambil rekaman.
successCallback Function Tidak. Fungsi untuk dipanggil saat rekaman tabel diambil. Lihat Mengembalikan Nilai
errorCallback Function Tidak. Fungsi untuk memanggil saat operasi gagal. Objek dengan properti berikut diteruskan:
- errorCode:Angka. Kode kesalahan sebagai angka desimal positif. Misalnya, kode kesalahan yang didokumenkan sebagai 0x80040333 akan dikembalikan sebagai 2147746611.
- message:Tali. Pesan kesalahan yang menjelaskan masalah.

Opsi

Opsi kueri sistem berikut didukung: $select, , $top, $filter, $expanddan $orderby.

$expand Gunakan opsi kueri sistem untuk mengontrol data apa dari tabel terkait yang dikembalikan. Jika Anda hanya menyertakan nama properti navigasi, Anda menerima semua properti untuk rekaman terkait. Anda bisa membatasi properti yang dikembalikan untuk rekaman terkait dengan menggunakan $select opsi kueri sistem dalam tanda kurung setelah nama properti navigasi. Gunakan opsi ini untuk properti navigasi bernilai tunggal dan bernilai koleksi . Untuk offline, hanya opsi berlapis $select di dalam yang $expand didukung.

Untuk menentukan kueri FetchXML, gunakan fetchXml kolom untuk menentukan kueri.

Nota

Anda harus selalu menggunakan $select opsi kueri sistem untuk membatasi properti yang dikembalikan untuk rekaman tabel dengan menyertakan daftar nama properti yang dipisahkan koma. Praktik ini penting untuk performa. Jika Anda tidak menentukan properti dengan menggunakan $select, semua properti dikembalikan.

Tentukan opsi kueri yang dimulai dengan ?. Anda juga bisa menentukan beberapa opsi kueri sistem dengan menggunakan & untuk memisahkan opsi kueri.

Saat Anda menentukan string kueri OData untuk options parameter , enkode kueri untuk karakter khusus.

Saat Anda menentukan kueri FetchXML untuk options parameter , jangan mengodekan kueri.

Untuk mempelajari cara menentukan options parameter untuk berbagai skenario pengambilan, lihat Contoh.

Mengembalikan nilai

Setelah berhasil, mengembalikan objek janji ke successCallback dengan properti berikut:

Nama Tipe Description
entities Array dari objek JSON Setiap objek mewakili rekaman tabel yang diambil yang berisi kolom dan nilainya sebagai key: value pasangan. ID rekaman tabel diambil secara default.
nextLink String (opsional) Jika jumlah rekaman yang diambil lebih dari nilai yang ditentukan dalam maxPageSize parameter dalam permintaan, ini mengembalikan URL untuk mengembalikan halaman rekaman berikutnya.
fetchXmlPagingCookie (opsional) Untuk operasi berbasis retrieveMultipleRecords fetchXml dengan halaman di mana jumlah catatan total lebih besar dari nilai halaman, atribut ini mengembalikan cookie halaman yang dapat digunakan untuk operasi fetchXml berikutnya untuk mengambil halaman rekaman berikutnya.

Jenis atribut yang tidak didukung untuk opsi kueri OData di seluler offline

Jenis Kolom berikut ini tidak didukung saat Anda menggunakan Xrm.WebApi.retrieveMultipleRecords dengan opsi string kueri OData (seperti $select dan $filter) dalam mode offline seluler. Gunakan FetchXML jika Anda perlu bekerja dengan jenis atribut dalam daftar jenis atribut yang tidak didukung ini.

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

Fitur yang tidak didukung di seluler offline

Fitur berikut ini tidak didukung di seluler offline:

  • Fitur pengelompokan dan agregasi

Operasi filter yang didukung per jenis atribut di seluler offline menggunakan FetchXML

Operasi berikut didukung untuk semua jenis atribut saat bekerja dengan FetchXML:

  • Sama dengan (eq)
  • Tidak Sama Dengan (neq)
  • Null (null)
  • Bukan Null (not-null)

Tabel berikut ini mencantumkan lebih banyak operasi yang didukung untuk setiap jenis atribut:

Jenis Atribut Operasi yang Didukung
BigInt, Desimal, Ganda, Bilangan Bulat Lebih Besar Dari (gt)
Lebih Besar Dari atau Sama Dengan (gte)
Kurang Dari (lt)
Kurang Dari atau Sama Dengan (lte)
Boolean, Pelanggan Dalam (in)
Tidak Dalam (not-in)
EntityName, Picklist, State, Status Seperti (like)
Tidak Suka (not-like)
Dimulai Dengan (begins-with)
Tidak Dimulai Dengan (not-begin-with)
Diakhir Dengan (ends-with)
Tidak Diakhir Dengan (not-end-with)
Dalam (in)
Tidak Dalam (not-in)
Guid, Pencarian Dalam (in)
Tidak Dalam (not-in)
Sama dengan ID Pengguna (eq-userid)
Tidak Sama dengan ID Pengguna (ne-userid)
Uang Lebih Besar Dari (gt)
Lebih Besar Dari atau Sama Dengan (gte)
Kurang Dari (lt)
Kurang Dari atau Sama Dengan (lte)
Dalam (in)
Tidak Dalam (not-in)
Pemilik Dalam (in)
Tidak Dalam (not-in)
Sama dengan ID Pengguna (eq-userid)
Tidak Sama dengan ID Pengguna (ne-userid)
Sama dengan Pengguna Atau Tim (eq-useroruserteams)
String Seperti (like)
Tidak Suka (not-like)
Dimulai Dengan (begins-with)
Tidak Dimulai Dengan (not-begin-with)
Diakhir Dengan (ends-with)
Tidak Diakhir Dengan (not-end-with)
DateTime Pada atau Setelah (on-or-after)
Aktif (on)
Aktif atau Sebelum (on-or-before)
Hari ini (today)
Besok (tomorrow)
Kemarin (yesterday)
Tujuh Hari Ke Depan (next-seven-days)
Tujuh Hari Terakhir (last-seven-days)
Minggu Depan (next-week)
Minggu Lalu (last-week)
Minggu Ini (this-week)
Bulan Depan (next-month)
Bulan Lalu (last-month)
Bulan Ini (this-month)
Tahun Depan (next-year)
Tahun Lalu (last-year)
Tahun Ini (this-year)
X Hari Terakhir (last-x-days)
X Hari Berikutnya (next-x-days)
X Minggu Terakhir (last-x-weeks)
Minggu X Berikutnya (next-x-weeks)
X Bulan Terakhir (last-x-months)
X Bulan Berikutnya (next-x-months)
X Tahun Terakhir (last-x-years)
Tahun X Berikutnya (next-x-years)
Lebih Besar Dari (gt)
Lebih besar dari atau sama dengan (gte)
Kurang Dari (lt)
Kurang dari atau Sama Dengan (lte)

Examples

Anda dapat menggunakan metode retrieveMultipleRecords untuk mencapai sebagian besar skenario dan contoh yang disebutkan dalam Data Kueri menggunakan API Web. Beberapa contoh tercantum di bagian berikut.

Pengambilan dasar beberapa

Contoh ini mengkueri kumpulan tabel akun dan menggunakan $select opsi kueri sistem dan $top untuk mengembalikan properti nama untuk tiga akun pertama:

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

Pengambilan dasar beberapa dengan FetchXML

Contoh ini mengkueri account entitas menggunakan 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
    }
);

Mengambil atau memfilter menurut properti pencarian

Untuk sebagian besar properti navigasi bernilai tunggal, Anda menemukan properti komputasi baca-saja yang menggunakan konvensi penamaan berikut: _<name>_value di mana <name> adalah nama properti navigasi bernilai tunggal. Untuk tujuan pemfilteran, Anda juga dapat menggunakan nilai tertentu dari properti navigasi bernilai tunggal. Namun, opsi sintaks ini tidak didukung untuk klien seluler dalam mode offline. Gunakan nama properti navigasi nilai tunggal untuk mengambil dan memfilter. Selain itu, mode offline tidak mendukung perbandingan properti navigasi ke null.

Informasi selengkapnya: Properti pencarian

Berikut adalah contoh kode untuk kedua skenario:

Untuk skenario online (tersambung ke server)

Contoh ini mengkueri kumpulan tabel akun dan menggunakan $select opsi kueri sistem dan $filter untuk mengembalikan nama dan properti primarycontactid untuk akun yang memiliki kontak utama tertentu:

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

Untuk skenario offline seluler

Contoh ini mengkueri kumpulan tabel akun dan menggunakan $select opsi kueri sistem dan $filter untuk mengembalikan nama dan properti primarycontactid untuk akun yang memiliki kontak utama tertentu saat bekerja dalam mode 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
    }
);

Menggunakan FetchXML untuk mengambil atau memfilter menurut properti pencarian (skenario online dan offline)

FetchXML Gunakan parameter saat online atau offline untuk mengambil name properti dan primarycontactid untuk rekaman akun yang memiliki kontak utama yang cocok dengan kondisi:

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

Tentukan jumlah tabel yang akan dikembalikan dalam halaman

Contoh berikut menunjukkan cara menggunakan maxPageSize parameter untuk menentukan bahwa setiap halaman menampilkan tiga rekaman.

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

Contoh ini menampilkan tiga rekaman dan tautan ke halaman berikutnya. Berikut adalah contoh output dari Konsol di alat pengembang 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

Gunakan bagian kueri dalam URL di nextLink properti sebagai nilai untuk options parameter dalam panggilan retrieveMultipleRecords berikutnya untuk meminta kumpulan rekaman berikutnya. Jangan ubah atau tambahkan opsi kueri sistem lagi ke nilai . Untuk setiap permintaan berikutnya untuk lebih banyak halaman, gunakan nilai yang sama dengan yang maxPageSize Anda gunakan dalam beberapa permintaan pengambilan asli. Selain itu, cache hasil yang dikembalikan atau nilai nextLink properti sehingga aplikasi Anda dapat mengembalikan halaman yang diambil sebelumnya.

Misalnya, untuk mendapatkan halaman rekaman berikutnya, teruskan bagian kueri URL nextLink ke 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
    }
);

Permintaan ini mengembalikan halaman berikutnya dari kumpulan hasil.

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

Penting

Nilai properti dikodekan nextLink URI. Jika Anda mengodekan nilai sebelum mengirimkannya, informasi cookie XML di URL menyebabkan kesalahan.

Contoh FetchXML (skenario online)

Contoh berikut menunjukkan cara menggunakan count parameter di FetchXML untuk menentukan bahwa setiap halaman menampilkan tiga rekaman.

Nota

Cookie halaman FetchXML hanya dikembalikan untuk operasi online retrieveMultipleRecords . (Xrm.WebApi.online). Ini tidak didukung secara 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
    }
);

Contoh ini menampilkan tiga rekaman dan mengembalikan cookie halaman FetchXML untuk mengambil hasil halaman berikutnya jika ada lebih banyak rekaman dalam kumpulan hasil. Berikut adalah contoh output dari Konsol di alat pengembang 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\" />"
}

Untuk mengambil kumpulan hasil besar dengan penomor, gunakan seperti yang fetchXmlPagingCookie ditunjukkan dalam contoh berikut.

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

Gunakan opsi kueri sistem $expand di properti navigasi untuk mengontrol data yang dikembalikan dari tabel terkait. Contoh berikut menunjukkan cara mengambil kontak untuk semua catatan akun. Untuk rekaman kontak terkait, Anda hanya mengambil contactid bidang dan 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
    }
);

Kode sebelumnya mengembalikan hasil dengan skema seperti:

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

Nota

Mirip dengan skenario online, gunakan opsi kueri sistem $expand untuk mengambil data dari tabel terkait secara offline. Namun, hubungan banyak ke banyak tidak didukung secara offline.

Metode yang tidak digunakan lagi untuk skenario offline seluler

Nota

@odata.nextLink tidak digunakan lagi untuk skenario offline seluler. Meskipun masih didukung untuk kustomisasi yang ada, jangan gunakan lagi.

Operasi $expand offline mengembalikan anotasi yang @odata.nextLink berisi informasi tentang cara masuk ke informasi rekaman terkait. Gunakan parameter , entityType, dan options anotasi tersebut iduntuk membuat satu atau beberapa permintaan tambahanXrm.WebApi.offline.retrieveRecord. Kode berikut memberikan contoh lengkap tentang cara melakukan ini:

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

Untuk contoh selengkapnya tentang mengambil beberapa rekaman dengan menggunakan API Web, lihat Data Kueri menggunakan API Web.

Mengkueri Data menggunakan Web API
Xrm.WebApi.retrieveRecord
Xrm.WebApi