Chia sẻ qua


retrieveMultipleRecords (Tài liệu tham khảo về API máy khách)

Truy xuất tuyển tập các bản ghi bảng.

Cú pháp

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

Tham số

Tên Kiểu Bắt buộc Description
entityLogicalName String Tên lô-gic bảng của các bản ghi bạn muốn truy xuất. Ví dụ: account.
options String Không Tùy chọn truy vấn hệ thống OData hoặc truy vấn FetchXML để truy xuất dữ liệu của bạn. Xem Tùy chọn
maxPageSize Số Không Xác định số dương cho biết số bản ghi bảng được trả về trên mỗi trang. Nếu bạn không xác định tham số này, giá trị được mặc định là giới hạn tối đa là 5.000 bản ghi cho bảng tiêu chuẩn, 500 cho bảng đàn hồi.

Nếu số bản maxPageSize ghi được truy xuất lớn hơn giá trị đã xác định hoặc giới hạn tối đa cho kiểu bảng, nextLink cột trong đối tượng promise được trả về sẽ chứa nối kết để truy xuất bản ghi.
successCallback Hàm Không Hàm cần gọi khi truy xuất bản ghi bảng. Xem Giá trị Trả về
errorCallback Hàm Không Một hàm để gọi khi hoạt động không thành công. Một đối tượng với các thuộc tính sau đây được truyền đi:
- errorCode:Số. Mã lỗi dưới dạng số thập phân dương. Ví dụ: mã lỗi được ghi là sẽ 0x80040333 được trả về dưới dạng 2147746611.
- message:Xâu. Thông báo lỗi mô tả sự cố.

số đếm

Các tùy chọn truy vấn hệ thống sau đây được hỗ trợ: $select, $filter$top, , $expand$orderby.

Sử dụng tùy chọn $expand truy vấn hệ thống để kiểm soát dữ liệu nào từ các bảng liên quan được trả về. Nếu bạn chỉ bao gồm tên của thuộc tính dẫn hướng, bạn sẽ nhận được tất cả các thuộc tính cho các bản ghi liên quan. Bạn có thể giới hạn các thuộc tính được trả về cho các bản ghi $select liên quan bằng cách dùng tùy chọn truy vấn hệ thống trong dấu ngoặc đơn sau tên thuộc tính dẫn hướng. Sử dụng tính năng này cho cả thuộc tính điều hướng có giá trị đơn và có giá trị bộ sưu tập . Lưu ý rằng đối với ngoại tuyến, chúng tôi chỉ hỗ trợ tùy chọn $select lồng bên trong $expand.

Để xác định truy vấn FetchXML, hãy sử dụng cột fetchXml để xác định truy vấn.

Lưu ý

Bạn phải luôn sử dụng tùy chọn $selecttruy vấn hệ thống để giới hạn các thuộc tính được trả về cho bản ghi bảng bằng cách bao gồm danh sách tên thuộc tính được phân tách bằng dấu phẩy. Đây là một phương pháp hay nhất về hiệu suất quan trọng. Nếu thuộc tính không được xác định bằng cách sử dụng $select, tất cả các thuộc tính sẽ được trả về.

Bạn chỉ định các tùy chọn truy vấn bắt đầu bằng ?. Bạn cũng có thể chỉ định nhiều tùy chọn truy vấn hệ thống bằng cách sử dụng & để phân tách các tùy chọn truy vấn.

Khi bạn xác định chuỗi truy vấn OData cho tham options số, truy vấn phải được mã hóa cho các ký tự đặc biệt.

Khi bạn xác định truy vấn FetchXML cho tham options số, truy vấn sẽ không được mã hóa.

Hãy xem Ví dụ để biết cách bạn có thể xác định tham số options cho nhiều trường hợp truy xuất khác nhau.

Trả về giá trị

Khi thành công, trả về đối tượng promise với successCallback các thuộc tính sau:

Tên Kiểu Description
entities Mảng đối tượng JSON Mỗi đối tượng đại diện cho bản ghi bảng đã truy xuất có chứa các cột và giá trị của chúng dưới dạng key: value cặp. ID của bản ghi bảng được truy xuất theo mặc định
nextLink String (tùy chọn) Nếu số bản ghi được maxPageSize truy xuất lớn hơn giá trị đã xác định trong tham số trong yêu cầu, điều này sẽ trả về URL để trả về trang bản ghi tiếp theo.
fetchXmlPagingCookie (tùy chọn) Đối với thao tác dựa trên fetchXml retrieveMultipleRecords với phân trang có tổng số lượng bản ghi lớn hơn giá trị phân trang, thuộc tính này trả về cookie phân trang có thể được sử dụng cho thao tác fetchXml tiếp theo để truy xuất trang tiếp theo của bản ghi.

Loại Thuộc tính Không được hỗ trợ cho các tùy chọn truy vấn OData trong Di động Ngoại tuyến

Các kiểu Cột sau đây không được hỗ Xrm.WebApi.retrieveMultipleRecords trợ khi thực hiện một thao tác với các tùy chọn chuỗi truy vấn OData (ví dụ, $select$filtervà ) trong chế độ ngoại tuyến di động. Bạn nên sử dụng FetchXML nếu loại thuộc tính bạn cần làm việc là trong danh sách các loại thuộc tính không được hỗ trợ này.

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

Các tính năng không được hỗ trợ trong Di động Ngoại tuyến

Các tính năng sau đây không được hỗ trợ trong Di động Ngoại tuyến:

  • Các tính năng nhóm và tổng hợp

Các thao tác Lọc được Hỗ trợ Cho Mỗi Loại Thuộc tính trong Thiết bị Di động Ngoại tuyến bằng fetchXML

Các thao tác sau đây được hỗ trợ cho tất cả các loại thuộc tính khi làm việc với FetchXML:

  • Bằng (eq)
  • Không Bằng (neq)
  • Null (null)
  • Not Null (not-null)

Bảng sau đây liệt kê các thao tác khác được hỗ trợ cho từng loại thuộc tính:

Loại thuộc tính Các thao tác được Hỗ trợ
BigInt, Decimal, Double, Integer Lớn Hơn (gt)
Lớn Hơn hoặc Bằng (gte)
Nhỏ Hơn (lt)
Nhỏ Hơn hoặc Bằng (lte)
Boolean, Khách hàng Trong (in)
Không Có Trong (not-in)
EntityName, Picklist, State, Status Like (like)
Not Like (not-like)
Bắt đầu Với (begins-with)
Không Bắt đầu Với (not-begin-with)
Kết thúc Bằng (ends-with)
Không Kết thúc Bằng (not-end-with)
Trong (in)
Không Có Trong (not-in)
Guid, Tra cứu Trong (in)
Không Có Trong (not-in)
Bằng ID Người dùng (eq-userid)
Not Equals User ID (ne-userid)
Money Lớn Hơn (gt)
Lớn Hơn hoặc Bằng (gte)
Nhỏ Hơn (lt)
Nhỏ Hơn hoặc Bằng (lte)
Trong (in)
Không Có Trong (not-in)
Chủ nhân Trong (in)
Không Có Trong (not-in)
Bằng ID Người dùng (eq-userid)
Not Equals User ID (ne-userid)
Bằng Người dùng Hoặc Nhóm (eq-useroruserteams)
String Like (like)
Not Like (not-like)
Bắt đầu Với (begins-with)
Không Bắt đầu Với (not-begin-with)
Kết thúc Bằng (ends-with)
Không Kết thúc Bằng (not-end-with)
Ngày Giờ Vào hoặc Sau (on-or-after)
Bật (on)
Vào hoặc trước (on-or-before)
Hôm nay (today)
Ngày mai (tomorrow)
Hôm qua (yesterday)
Bảy Ngày Tới (next-seven-days)
Bảy Ngày trước (last-seven-days)
Tuần Tới (next-week)
Tuần Trước (last-week)
Tuần Này (this-week)
Tháng Tới (next-month)
Tháng Trước (last-month)
Tháng Này (this-month)
Năm Sau (next-year)
Năm ngoái (last-year)
Năm nay (this-year)
X Ngày Trước (last-x-days)
X Ngày Tiếp theo (next-x-days)
X Tuần Trước (last-x-weeks)
X Tuần Tới (next-x-weeks)
X Tháng Trước (last-x-months)
Tháng X Tiếp theo (next-x-months)
Năm X Cuối (last-x-years)
Năm X Tiếp theo (next-x-years)
Lớn Hơn (gt)
Lớn Hơn Hoặc Bằng (gte)
Nhỏ Hơn (lt)
Nhỏ hơn Hoặc Bằng (lte)

Ví dụ

Hầu hết các kịch bản/ví dụ được đề cập trong Dữ liệu Truy vấn sử dụng API Web có thể đạt được bằng cách sử dụng phương pháp retrieveMultipleRecords . Dưới đây là một số ví dụ.

Truy xuất cơ bản nhiều

Ví dụ này truy vấn bộ bảng tài khoản và sử dụng các tùy $select chọn $top truy vấn hệ thống và để trả về thuộc tính tên cho ba tài khoản đầu tiên:

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

Cơ bản truy xuất nhiều với FetchXML

Ví dụ này truy vấn thực account thể sử dụng 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
    }
);

Truy xuất hoặc lọc theo thuộc tính tra cứu

Đối với hầu hết các thuộc tính dẫn hướng đơn giá trị, bạn sẽ tìm thấy thuộc tính tính, chỉ đọc sử dụng quy ước đặt tên sau: _<name>_value<name> trong đó tên của thuộc tính dẫn hướng đơn giá trị. Đối với mục đích lọc, giá trị cụ thể của thuộc tính dẫn hướng đơn giá trị cũng có thể được sử dụng. Tuy nhiên, đối với máy khách di động ở chế độ ngoại tuyến, các tùy chọn cú pháp này không được hỗ trợ và tên thuộc tính dẫn hướng giá trị đơn nên được dùng cho cả truy xuất và lọc. Ngoài ra, việc so sánh các thuộc tính dẫn hướng với null không được hỗ trợ trong chế độ ngoại tuyến.

Thông tin thêm: Thuộc tính tra cứu

Dưới đây là các ví dụ về mã cho cả hai kịch bản:

Đối với kịch bản trực tuyến (được kết nối với máy chủ)

Ví dụ này truy vấn bảng tài $select$filter khoản đã đặt và sử dụng các tùy chọn truy vấn hệ thống và để trả về tên và thuộc tính primarycontactid cho các tài khoản có liên hệ chính cụ thể:

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

Đối với trường hợp ngoại tuyến trên thiết bị di động

Ví dụ này truy vấn bảng tài $select$filter khoản đã đặt và sử dụng các tùy chọn truy vấn hệ thống để trả về tên và thuộc tính primarycontactid cho các tài khoản có liên hệ chính cụ thể khi làm việc trong chế độ ngoại tuyến:

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

Sử dụng FetchXML để truy xuất hoặc lọc theo thuộc tính tra cứu (kịch bản trực tuyến và ngoại tuyến)

Bạn có thể sử dụng tham FetchXML số khi trực tuyến hoặc ngoại tuyến để truy nameprimarycontactid xuất thuộc tính và cho hồ sơ tài khoản có liên hệ chính khớp với điều kiện:

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

Chỉ rõ số lượng bảng cần trả về trong một trang

Ví dụ sau đây minh họa việc sử dụng maxPageSize tham số để chỉ định số lượng bản ghi (3) sẽ được hiển thị trong một trang.

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

Ví dụ này sẽ hiển thị ba bản ghi và nối kết đến trang tiếp theo. Sau đây là ví dụ đầu ra từ Bảng điều khiển trong công cụ dành cho nhà phát triển trình duyệt:

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

Sử dụng phần truy vấn trong URL nextLinkoptions trong thuộc tính làm giá trị cho tham số trong cuộc gọi retrieveMultipleRecords tiếp theo của bạn để yêu cầu bộ bản ghi tiếp theo. Không thay đổi hoặc chắp thêm bất kỳ tùy chọn truy vấn hệ thống nào vào giá trị. Đối với mỗi yêu cầu tiếp theo cho nhiều trang hơn, bạn nên sử dụng cùng một giá maxPageSize trị được sử dụng trong bản gốc truy xuất nhiều yêu cầu. Ngoài ra, đệm ẩn các kết quả trả về hoặc giá trị của thuộc tính nextLink để các trang đã truy xuất trước đó có thể được trả về.

Ví dụ: để có được trang bản ghi tiếp theo, chúng ta sẽ chuyển phần truy vấn của nextLink URL đến tham options số:

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

Điều này sẽ trả về trang tiếp theo của resultset:

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

Quan trọng

Giá trị của thuộc nextLink tính được mã hóa URI. Nếu URI mã hóa giá trị trước khi gửi, thông tin cookie XML trong URL sẽ gây ra lỗi.

Ví dụ về FetchXML (kịch bản trực tuyến)

Ví dụ sau đây minh họa count việc sử dụng tham số của FetchXML để chỉ định số bản ghi (3) sẽ được hiển thị trong một trang.

Lưu ý

Cookie phân trang FetchXML chỉ được trả về cho các thao tác trực retrieveMultipleRecords tuyến. (Xrm.WebApi.online). Nó không được hỗ trợ ngoại tuyến.

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

Ví dụ này sẽ hiển thị ba bản ghi và trả về Cookie Phân trang FetchXML để truy xuất kết quả của trang tiếp theo nếu có nhiều bản ghi hơn thuộc về tập kết quả. Sau đây là ví dụ đầu ra từ Bảng điều khiển trong công cụ dành cho nhà phát triển trình duyệt:

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

Chúng ta có thể sử dụng fetchXmlPagingCookie như minh họa trong ví dụ dưới đây để tải các tập kết quả lớn với phân trang.

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

Sử dụng tùy $expand truy vấn hệ thống trong thuộc tính dẫn hướng để điều khiển dữ liệu được trả về từ các bảng liên quan. Ví dụ sau đây minh họa cách truy xuất liên hệ cho tất cả hồ sơ tài khoản. Đối với các bản ghi liên hệ liên quan, chúng tôi chỉ truy xuất và 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
    }
);

Đoạn mã ở trên trả về kết quả với một sơ đồ như:

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

Lưu ý

Tương tự như kịch bản trực tuyến, hãy sử dụng tùy $expand truy vấn hệ thống để truy xuất dữ liệu từ các bảng liên quan ở chế độ ngoại tuyến. Tuy nhiên, mối quan hệ nhiều đối nhiều không được hỗ trợ trong ngoại tuyến.

Phương pháp bị phản đối cho kịch bản ngoại tuyến dành cho thiết bị di động

Lưu ý

Trường hợp @odata.nextLink ngoại tuyến trên thiết bị di động không được chấp nhận. Mặc dù tính năng này vẫn được hỗ trợ cho các tùy chỉnh hiện có, nhưng bạn không nên sử dụng tùy chỉnh này nữa.

Thao tác $expand tuyến trả về @odata.nextLink một chú thích chứa thông tin về cách đến thông tin của bản ghi liên quan. Chúng tôi sử dụng id, và tham options số của chú thích đó để xây dựng một hoặc nhiều yêu cầu Xrm.WebApi.offline.retrieveRecord bổ entityTypesung. Đoạn mã sau đây cung cấp một ví dụ đầy đủ về cách thực hiện việc này:

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

Để biết thêm ví dụ về việc truy xuất nhiều bản ghi bằng web API, hãy xem Dữ liệu truy vấn sử dụng WEB API.

Truy vấn dữ liệu bằng API Web
Xrm.WebApi.retrieveRecord
Xrm.WebApi