استرداد سجلات Multiple (مرجع واجهة برمجة تطبيقات العميل)

استرداد مجموعة من سجلات الجدول.

بناء الجملة

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

المعلمات

الاسم نوع مطلوبة ‏‏الوصف
entityLogicalName سلسلة ‏‏نعم‬ الاسم المنطقي للجدول للسجلات التي تريد استردادها. على سبيل المثال: account.
options سلسلة لا خيارات استعلام نظام OData أو استعلام FetchXML لاسترداد بياناتك. عرض الخيارات
maxPageSize الرقم‬ لا حدد رقما موجبا يشير إلى عدد سجلات الجدول المراد إرجاعها لكل صفحة. إذا لم تحدد هذه المعلمة، فإن القيمة الافتراضية هي الحد الأقصى وهو 5000 سجل للجداول القياسية و500 للجداول المرنة.

إذا كان عدد السجلات التي تقوم باستردادها أكثر من القيمة المحددة maxPageSize أو الحد الأقصى لنوع الجدول، nextLink فإن العمود في كائن الوعد الذي تم إرجاعه يحتوي على ارتباط لاسترداد السجلات.
successCallback الوظيفة لا دالة لاستدعاء عند استرداد سجلات الجدول. راجع القيمة المرجعة
errorCallback الوظيفة لا وظيفة للاتصال عند فشل العملية. يتم تمرير كائن بالخصائص التالية:
- errorCode:رقم. رمز الخطأ كرقم عشري موجب. على سبيل المثال، رمز الخطأ الموثق كما 0x80040333 سيتم إرجاعه ك 2147746611.
- message:خيط. رسالة خطأ تصف المشكلة.

الخيارات

يتم دعم خيارات استعلام النظام التالية: $selectو$top$filter$expand.$orderby

$expand استخدم خيار استعلام النظام للتحكم في البيانات من الجداول ذات الصلة التي يتم إرجاعها. إذا قمت بتضمين اسم خاصية التنقل فقط، فستتلقى جميع خصائص السجلات ذات الصلة. يمكنك تحديد الخصائص التي تم إرجاعها للسجلات ذات الصلة باستخدام $select خيار استعلام النظام بين قوسين بعد اسم خاصية التنقل. استخدم هذا الخيار لكل من خصائص التنقل ذات القيمة المفردةوقيمة المجموعة . للخيار غير المتصل، يتم دعم الخيار المتداخل $select داخل $expand فقط.

لتحديد استعلام FetchXML، استخدم fetchXml العمود لتحديد الاستعلام.

إشعار

يجب عليك دائما استخدام $select خيار استعلام النظام للحد من الخصائص التي تم إرجاعها لسجل جدول عن طريق تضمين قائمة أسماء الخصائص مفصولة بفواصل. هذه الممارسة مهمة للأداء. إذا لم تحدد خصائص باستخدام $select، يتم إرجاع جميع الخصائص.

حدد خيارات الاستعلام بدءا من ?. يمكنك أيضا تحديد خيارات استعلام نظام متعددة باستخدام & لفصل خيارات الاستعلام.

عند تحديد سلسلة استعلام OData للمعلمة options ، قم بترميز الاستعلام للأحرف الخاصة.

عند تحديد استعلام FetchXML للمعلمة options ، لا تقم بترميز الاستعلام.

لمعرفة كيفية تعريف المعلمة options لاسترداد سيناريوهات متعددة مختلفة، راجع الأمثلة.

قيمة الإرجاع

عند النجاح، ترجع عنصر وعد إلى successCallback مع الخصائص التالية:

الاسم نوع ‏‏الوصف
entities مصفوفة كائنات JSON يمثل كل كائن سجل الجدول المسترد الذي يحتوي على أعمدة وقيمها كأزواج key: value . يتم استرداد معرف سجل الجدول بشكل افتراضي.
nextLink سلسلة (اختياري) إذا كان عدد السجلات التي يتم استردادها أكثر من القيمة المحددة في المعلمة maxPageSize في الطلب، فإن هذا يرجع عنوان URL لإرجاع الصفحة التالية من السجلات.
fetchXmlPagingCookie (اختياري) بالنسبة لعملية مستندة إلى retrieveMultipleRecords fetchXml مع ترحيل الصفحات حيث يكون إجمالي عدد السجلات أكبر من قيمة الترحيل، ترجع هذه السمة ملف تعريف ارتباط الترحيل الذي يمكن استخدامه لعملية fetchXml لاحقة لاسترداد الصفحة التالية من السجلات.

أنواع السمات غير المعتمدة لخيارات استعلام OData في الهاتف المحمول دون اتصال

لا يتم دعم أنواع الأعمدة التالية عند استخدامها Xrm.WebApi.retrieveMultipleRecords مع خيارات سلسلة استعلام OData (مثل $select و $filter) في وضع عدم الاتصال بالهاتف المحمول. استخدم FetchXML إذا كنت بحاجة إلى العمل مع نوع سمة في هذه القائمة لأنواع السمات غير المدعومة.

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

الميزات غير المدعومة في وضع عدم الاتصال بالهاتف المحمول

الميزات التالية غير مدعومة في وضع عدم الاتصال بالهاتف المحمول:

  • ميزات التجميع والتجميع

عمليات التصفية المدعومة لكل نوع سمة في الهاتف المحمول دون اتصال باستخدام FetchXML

يتم دعم العمليات التالية لجميع أنواع السمات عند العمل مع FetchXML:

  • يساوي (eq)
  • لا يساوي (neq)
  • Null (null)
  • ليست خالية (not-null)

يسرد الجدول التالي المزيد من العمليات المدعومة لكل نوع سمة:

نوع السمة العمليات المدعومة
BigInt، عشري، مزدوج، عدد صحيح أكبر من (gt)
أكبر من أو يساوي (gte)
أقل من (lt)
أقل من أو يساوي (lte)
منطقي، عميل في (in)
ليس في (not-in)
EntityName, Picklist, State, Status Like (like)
Not Like (not-like)
يبدأ ب (begins-with)
لا تبدأ ب (not-begin-with)
ينتهي ب (ends-with)
لا تنتهي ب (not-end-with)
في (in)
ليس في (not-in)
Guid، البحث في (in)
ليس في (not-in)
يساوي معرف المستخدم (eq-userid)
لا يساوي معرف المستخدم (ne-userid)
Money أكبر من (gt)
أكبر من أو يساوي (gte)
أقل من (lt)
أقل من أو يساوي (lte)
في (in)
ليس في (not-in)
Owner في (in)
ليس في (not-in)
يساوي معرف المستخدم (eq-userid)
لا يساوي معرف المستخدم (ne-userid)
يساوي المستخدم أو الفريق (eq-useroruserteams)
سلسلة Like (like)
Not Like (not-like)
يبدأ ب (begins-with)
لا تبدأ ب (not-begin-with)
ينتهي ب (ends-with)
لا تنتهي ب (not-end-with)
التاريخ والوقت تشغيل أو بعد (on-or-after)
تشغيل (on)
في أو قبل (on-or-before)
اليوم (today)
غدا (tomorrow)
أمس (yesterday)
الأيام السبعة التالية (next-seven-days)
آخر سبعة أيام (last-seven-days)
الأسبوع القادم (next-week)
الأسبوع الماضي (last-week)
هذا الأسبوع (this-week)
الشهر القادم (next-month)
الشهر الماضي (last-month)
هذا الشهر (this-month)
السنة القادمة (next-year)
العام الماضي (last-year)
هذا العام (this-year)
آخر X أيام (last-x-days)
الأيام X التالية (next-x-days)
آخر X أسابيع (last-x-weeks)
الأسابيع X التالية (next-x-weeks)
آخر X أشهر (last-x-months)
الأشهر X التالية (next-x-months)
السنوات X الأخيرة (last-x-years)
السنوات X التالية (next-x-years)
أكبر من (gt)
أكبر من أو يساوي (gte)
أقل من (lt)
أقل من أو يساوي (lte)

الأمثلة

يمكنك استخدام أسلوب retrieveMultipleRecords لتحقيق معظم السيناريوهات والأمثلة المذكورة في Query Data باستخدام واجهة برمجة تطبيقات الويب. يتم سرد بعض الأمثلة في القسم التالي.

استرداد أساسي متعدد

يستعلم هذا المثال عن مجموعة جدول الحسابات ويستخدم $select خياري استعلام النظام وإرجاع $top خاصية الاسم للحسابات الثلاثة الأولى:

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

استرداد متعدد أساسي باستخدام FetchXML

يستعلم هذا المثال عن account الكيان باستخدام 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
    }
);

استرداد خصائص البحث أو تصفيتها

بالنسبة لمعظم خصائص التنقل ذات القيمة الواحدة، يمكنك العثور على خاصية محسوبة للقراءة فقط تستخدم اصطلاح التسمية التالي: _<name>_value حيث <name> يكون هو اسم خاصية التنقل ذات القيمة الواحدة. لأغراض التصفية، يمكنك أيضا استخدام القيمة المحددة لخاصية التنقل ذات القيمة الواحدة. ومع ذلك، فإن خيارات بناء الجملة هذه غير مدعومة لعملاء الأجهزة المحمولة في وضع عدم الاتصال. استخدم اسم خاصية التنقل ذات القيمة الواحدة لكل من الاسترداد والتصفية. أيضا، لا يدعم وضع عدم الاتصال مقارنة خصائص التنقل بالقيمة الفارغة.

مزيد من المعلومات: خصائص البحث

فيما يلي أمثلة للتعليمات البرمجية لكلا السيناريوهين:

للسيناريو عبر الإنترنت (متصل بالخادم)

يستعلم هذا المثال عن مجموعة جداول الحسابات ويستخدم $select خياري استعلام النظام وإرجاع $filter الاسم وخاصية primarycontactid للحسابات التي لها جهة اتصال أساسية معينة:

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

لسيناريو عدم الاتصال بالهاتف المحمول

يستعلم هذا المثال عن مجموعة جداول الحسابات ويستخدم $select خياري استعلام النظام وإرجاع $filter الاسم وخاصية primarycontactid للحسابات التي لديها جهة اتصال أساسية معينة عند العمل في وضع عدم الاتصال:

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

استخدام FetchXML لاسترداد خصائص البحث أو تصفيتها (سيناريو متصل وغير متصل)

استخدم المعلمة FetchXML أثناء الاتصال أو دون اتصال لاسترداد الخاصية name و primarycontactid لسجلات الحساب التي تحتوي على جهة اتصال أساسية تطابق شرطا:

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

تحديد عدد الجداول التي تريد إرجاعها في صفحة

يوضح المثال التالي كيفية استخدام المعلمة maxPageSize لتحديد أن كل صفحة تعرض ثلاثة سجلات.

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

يعرض هذا المثال ثلاثة سجلات وارتباط إلى الصفحة التالية. فيما يلي مثال على الإخراج من وحدة التحكم في أدوات مطور المستعرض:

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

استخدم جزء الاستعلام في عنوان URL في nextLink الخاصية كقيمة للمعلمة options في استدعاء استردادMultipleRecords التالي لطلب المجموعة التالية من السجلات. لا تغير أو تضيف المزيد من خيارات استعلام النظام إلى القيمة. لكل طلب لاحق لمزيد من الصفحات، استخدم نفس maxPageSize القيمة التي استخدمتها في استرداد طلب متعدد الأصلي. أيضا، قم بتخزين النتائج التي تم إرجاعها أو قيمة الخاصية مؤقتا حتى يتمكن تطبيقك من nextLink إرجاع الصفحات التي تم استردادها مسبقا.

على سبيل المثال، للحصول على الصفحة التالية من السجلات، مرر جزء الاستعلام من nextLink عنوان URL إلى المعلمة 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
    }
);

يقوم هذا الطلب بإرجاع الصفحة التالية من مجموعة النتائج.

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

هام

قيمة الخاصية nextLink هي URI مرمزة. إذا قمت بترميز القيمة قبل إرسالها، فإن معلومات ملف تعريف الارتباط XML في عنوان URL تتسبب في حدوث خطأ.

مثال FetchXML (سيناريو عبر الإنترنت)

يوضح المثال التالي كيفية استخدام المعلمة count في FetchXML لتحديد أن كل صفحة تعرض ثلاثة سجلات.

إشعار

يتم إرجاع ملف تعريف ارتباط ترحيل FetchXML فقط للعمليات عبر الإنترنت retrieveMultipleRecords . (Xrm.WebApi.online). إنه غير مدعوم دون اتصال.

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

يعرض هذا المثال ثلاثة سجلات ويرجع ملف تعريف ارتباط ترحيل ترحيل FetchXML لاسترداد نتائج الصفحة التالية إذا كان هناك المزيد من السجلات في مجموعة النتائج. فيما يلي مثال على الإخراج من وحدة التحكم في أدوات مطور المستعرض:

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

لجلب مجموعات نتائج كبيرة مع الترحيل، استخدم fetchXmlPagingCookie كما هو موضح في المثال التالي.

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

استخدم خيار استعلام النظام $expand في خصائص التنقل للتحكم في البيانات التي ترجع من الجداول ذات الصلة. يوضح المثال التالي كيفية استرداد جهة الاتصال لكافة سجلات الحساب. بالنسبة لسجلات جهات الاتصال ذات الصلة، يمكنك استرداد الحقلين contactid و 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
    }
);

ترجع التعليمات البرمجية السابقة نتيجة بمخطط مثل:

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

إشعار

على غرار السيناريو عبر الإنترنت، استخدم خيار استعلام النظام $expand لاسترداد البيانات من الجداول ذات الصلة في وضع عدم الاتصال. ومع ذلك، لا يتم دعم علاقات متعدد إلى متعدد في وضع عدم الاتصال.

أسلوب مهمل لسيناريو الهاتف المحمول دون اتصال

إشعار

تم @odata.nextLink إهمال لسيناريوهات الهاتف المحمول دون اتصال. على الرغم من أنه لا يزال مدعوما للتخصيصات الحالية، فلا تستخدمه بعد الآن.

تقوم عملية $expand دون اتصال بإرجاع @odata.nextLink تعليق توضيحي يحتوي على معلومات حول كيفية الوصول إلى معلومات السجل ذي الصلة. id entityTypeاستخدم المعلمات و و options لهذا التعليق التوضيحي لإنشاء طلب إضافي Xrm.WebApi.offline.retrieveRecord واحد أو أكثر. توفر التعليمات البرمجية التالية مثالا كاملا على كيفية القيام بذلك:

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

لمزيد من الأمثلة على استرداد سجلات متعددة باستخدام واجهة برمجة تطبيقات الويب، راجع الاستعلام عن البيانات باستخدام واجهة برمجة تطبيقات الويب.

الاستعلام عن البيانات باستخدام واجهة برمجة تطبيقات الويب
Xrm.WebApi.retrieveRecord
Xrm.WebApi