مشاركة عبر


استرداد سجلات 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 في Mobile Offline

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

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

الميزات غير المعتمدة في Mobile Offline

الميزات التالية غير مدعومة في Mobile Offline:

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

عمليات التصفية المدعومة لكل نوع سمة في الهاتف المحمول دون اتصال باستخدام 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)

الأمثلة

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

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

يستعلم هذا المثال عن مجموعة جدول الحسابات ويستخدم $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 لتحديد عدد السجلات (3) التي سيتم عرضها في صفحة.

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 لتحديد عدد السجلات (3) التي سيتم عرضها في صفحة.

إشعار

يتم إرجاع ملف تعريف ارتباط ترحيل 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 Paging لاسترداد نتائج الصفحة التالية إذا كان هناك المزيد من السجلات التي تنتمي إلى مجموعة النتائج. فيما يلي مثال على الإخراج من وحدة التحكم في أدوات مطور المستعرض:

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