سؤال

أنا أستخدم خدمة ويب تعرض قائمة بالمنتجات.لقد قمت بإنشاء طريقة عرض الشبكة برمجيًا واستخدمت القائمة كمصدر بيانات.ومع ذلك، لا يمكنني استخدام أساليب الترحيل/الفرز لأنها تسبب أخطاء لأنني لا أستخدم عنصر تحكم ObjectSource.لقد تعاملت مع الترحيل والفرز يدويًا، لكنني لا أعرف ما إذا كنت أفعل ذلك بكفاءة أم لا.عندما ينقر المستخدم على صفحة جديدة، أتعامل مع تغيير فهرس الصفحة على النحو التالي:

protected void gvProductList_PageIndexChanging(object sender, GridViewPageEventArgs e)
{

    userProducts = Data.GetProductList();

    this.gvProductList.PageIndex = e.NewPageIndex;
    this.gvProductList.DataSource = userProducts;
    gvProductList.DataBind();
}

ومع ذلك، يتم استدعاء قاعدة البيانات دائمًا عندما أقوم بتغيير الصفحات.هل هناك طريقة لجعل هذا أكثر كفاءة، أم أن هذا طبيعي بالنسبة للترحيل؟الأمر نفسه ينطبق على الفرز، الذي يستخدم خدمة الويب للحصول على المنتجات، ثم يستخدم تعبير لامدا لفرز المنتجات وفقًا لأعمدة مختلفة.وفي كل مرة يحدث ذلك، يتم استدعاء قاعدة البيانات (من أجل الحصول على قائمة المنتجات مرة أخرى).هل أتعامل مع هذا بشكل خاطئ؟أعلم أنه يمكنني استخدام الجلسات وما شابه ذلك لتخزين القائمة، ولكن يمكن أن يكون هناك مئات من الكائنات المخصصة لكل قائمة وعشرات الآلاف من المستخدمين في وقت واحد.

يجب أن أشير إلى أن خدمة الويب يتم توفيرها من قبل طرف ثالث (وبالتالي يتم استدعاء قاعدة بياناتهم)، مما يعني أنني لن أتمكن من الوصول إلى SQL Server نفسه ولا أي طرق لتغيير خدمة الويب.

شكرا على اي مساعدة.

يحرر:يجب أن أذكر أن قائمة المنتجات هي عربة التسوق الخاصة بالمستخدم.ولذلك، فهو فريد لكل مستخدم.

اجماع عام: إذا كانت عربة التسوق لا تحتوي على العديد من العناصر، فستكون الطريقة الحالية مناسبة.ومع ذلك، إذا كان التخزين المؤقت مطلوبًا، فيمكن تحقيق ذلك إما باستخدام جلسات In Proc، أو تخزين الجلسات على SQL Server.

هل كانت مفيدة؟

المحلول

لا، إنها ليست فعالة لأنك تقوم بإعادة كل سجل في قاعدة البيانات الأساسية (بافتراض أن GetProductList() تقوم بإرجاع كافة السجلات).يعني ترحيل صفحات GridView فقط أنه يعرض فقط عدد الصفوف المحددة في PageSize لـ PageIndex المحدد - ولكنه لا يؤثر على عدد السجلات التي يتم إرجاعها فعليًا من مصدر البيانات.

لسوء الحظ، نظرًا لأنه ليس لديك إمكانية الوصول المباشر إلى قاعدة البيانات ولا تقدم خدمة الويب أي طرق أخرى، فإن أفضل ما يمكنك فعله على الأرجح هو تخزين البيانات مؤقتًا.لحسن الحظ يجعل asp.net تخزين البيانات مؤقتًا بسيط جدًا.يشبه كائن ذاكرة التخزين المؤقت الجلسة، باستثناء أنه لديك مثيل واحد فقط لكل تطبيق، وليس لكل مستخدم.

نصائح أخرى

يبدو أنك تقوم بجلب جميع المنتجات من خدمة الويب، ثم تقوم بالفرز والترحيل من داخل صفحة الويب الخاصة بك.وهذا يعني أنك تقوم بسحب بيانات من خدمة الويب أكثر مما تحتاج إليه في أي وقت.هل توفر خدمة الويب إمكانية تمرير الوسائط التي تمثل الصفحة المطلوبة وحجم الصفحة وترتيب الفرز؟إذا لم يكن الأمر كذلك، فربما ينبغي عليك مناقشة إمكانية إضافة هذه الميزات مع الطرف الثالث الذي يقدم الخدمة.

إذا لم يكن ذلك ممكنًا، كم مرة يتم تحديث قائمة المنتجات؟إذا تم تحديثه بشكل غير متكرر نسبيًا، فيمكنك استخدام ذاكرة التخزين المؤقت لـ ASP.NET لتخزين نتائج استدعاء خدمة الويب محليًا.يمكن تعيين مصدر البيانات المخزنة مؤقتًا بحيث تنتهي صلاحيته كل ساعة على سبيل المثال.بهذه الطريقة، سيرى المستخدمون الذين يشاهدون الصفحة قائمة محدثة بشكل معقول من المنتجات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top