سؤال

لقد بدأنا للتو في استخدام LINQ إلى SQL في العمل من أجل DAL الخاص بنا ولم نتوصل حقًا إلى معيار لنموذج التخزين المؤقت الخارجي.في السابق كنا نستخدم فئة "DAL" الأساسية التي نفذت خاصية مدير ذاكرة التخزين المؤقت التي ورثت منها جميع فئات DAL الخاصة بنا، ولكن الآن ليس لدينا ذلك.أتساءل عما إذا كان أي شخص قد توصل إلى أسلوب "قياسي" للتخزين المؤقت لـ LINQ لنتائج SQL؟

نحن نعمل في بيئة ويب (IIS) إذا كان ذلك يحدث فرقًا.أعلم أن هذا قد ينتهي به الأمر إلى أن يكون شخصي سؤال، ولكن ما زلت أعتقد أن المعلومات ستكون ذات قيمة.

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

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

المحلول

إجابة سريعة:استخدم نمط المستودع (راجع التصميم المبني على المجال بواسطة Evans) لجلب الكيانات الخاصة بك.سيقوم كل مستودع بتخزين الأشياء التي سيحتفظ بها، من الناحية المثالية عن طريق السماح لكل مثيل من المستودع بالوصول إلى ذاكرة تخزين مؤقت مفردة (سيعمل كل مؤشر ترابط/طلب على إنشاء مستودع جديد ولكن يمكن أن يكون هناك ذاكرة تخزين مؤقت واحدة فقط).

الإجابة أعلاه تعمل على جهاز واحد فقط.لتتمكن من استخدام هذا على العديد من الأجهزة، استخدم com.memcached كحل التخزين المؤقت الخاص بك.حظ سعيد!

نصائح أخرى

لي ذاكرة التخزين المؤقت لنتائج استعلام LINQ ربما هو فقط ما تبحث عنه.

var q = from c in context.Customers
        where c.City == "London"
        select new { c.Name, c.Phone };

var result = q.Take(10).FromCache();

بيت.

إنه مباشرة تحت أنفك:

List<TableItem> myResult = (from t in db.Table select t).ToList();

الآن، ما عليك سوى تخزين myResult مؤقتًا كما لو كنت قد قمت بتخزين بيانات DAL القديمة التي تم إرجاعها.

وجدت هذا المشنور, ، والذي يقدم طريقة تمديد كوسيلة للتخزين المؤقت لكائنات LINQ.

لقد كنت أضرب رأسي بالحائط بسبب نقاط الضعف التي أحاول الآن اكتشاف حل جيد للتخزين المؤقت لـ Linq2SQL، ويجب أن أعترف بأنني أواجه صعوبة حقًا في العثور على مقاس واحد يناسب الجميع...

يميل نمط المستودع إلى الحد من فائدة Linq، حيث أنه (بدون إعادة تنفيذ IQueryable) يجب إجراء التخزين المؤقت خارج بيان Linq.

علاوة على ذلك، يعد التحميل المؤجل وتتبع الكائنات أمرًا محظورًا للغاية إذا كنت تريد تخزين العناصر مؤقتًا، مما يجعل إجراء التحديثات أكثر صعوبة إلى حد ما.

أي شخص تمكن من حل هذه المشكلة بشكل مباشر ضمن مشروع ويب متزامن للغاية، يرجى المشاركة وإنقاذ العالم!:)

أفهم أن هذه ربما تكون إجابة متأخرة بعض الشيء ...ليس أقل من ذلك، يمكنك محاولة LinqToCache مشروع.فهو يربط SqlDepdency باستعلام LINQ التعسفي، إن أمكن، ويوفر إبطال ذاكرة التخزين المؤقت النشطة عبر إشعارات الاستعلام من جانب الخادم.يجب أن تكون الاستعلامات استعلامات صالحة للإخطارات، راجع إنشاء استعلام للإخطار.تتوافق معظم استعلامات Linq-to-sql مع هذه القيود، طالما تم تحديد الجداول باستخدام أسماء مكونة من جزأين (dbo.Table, ، ليس فقط Table).

راجع طريقة "GetReferenceData" في فئة "ReferenceData" في هذا المقال: http://blog.huagati.com/res/index.php/2008/06/23/application-architecture-part-2-data-access-layer-dynamic-linq/

ويستخدم ذاكرة التخزين المؤقت لصفحة asp.net للتخزين المؤقت للبيانات التي تم استردادها باستخدام L2S.

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