سؤال

في سلسلة متاجر Rob Conery ، يستفيد Rob من LazyList<..> بناء لسحب البيانات من IQueryables.

  • كيف يختلف هذا عن System.Lazy<...> بناء الآن متاح في .NET 4.0 (وربما في وقت سابق)؟

المزيد من العمق بناءً على إجابة الدكتوراه الرائعة:

  1. هل تنصح بواحد على الآخر إذا أردت العمل IQueryable ك List<T>?
    أفترض ذلك منذ ذلك الحين Lazy<T> هل هو في الإطار الآن ، إنه رهان أكثر أمانًا للدعم المستقبلي والقابلية للصيانة؟
  2. إذا كنت أرغب في استخدام نوع قوي بدلاً من مجهول (var) النوع هل يمكن أن تكون العبارات التالية مكافئة وظيفية؟
    • Lazy<List<Products>> Products = new Lazy<List<Product>>();
    • LazyList<Product> = new LazyList<Product>();
هل كانت مفيدة؟

المحلول

ال Lasylistu003CT> يعمل فقط مع iqueryableu003CT> مصدر. إنه تطبيق الأول قائمةu003CT> ويعمل من خلال ملء قائمة خاصة مع جميع النتائج من iQueryable المحددةu003CT> . يحدث التهيئة في المرة الأولى التي تصل فيها إلى أي من Ilistu003CT> أفراد.

استخدام مثال سيكون

var myList = new LazyList(products.Where(p => p.Name.StartsWith("T"));
//initialization occurs here
Console.Write(myList.Count);

ال System.Lazyu003CT> يعمل الفصل مع أي نوع ولا يقتصر على iqueryableu003CT> . يحدث التهيئة الكسول في المرة الأولى كسولu003CT> .قيمة يتم الوصول إلى الممتلكات.

استخدام مثال سيكون

var lazyString = new Lazy(() => "Hello world");
//initialization occurs here
Console.Write(lazyString.Value);

يمكننا إعادة كتابة Lazylistu003CT> مثال لاستخدام كسولu003CT> كالآتي:

var myList = new Lazy(() => products.Where(p => p.Name.StartsWith("T").ToList());
//initialization occurs here
Console.Write(myList.Value.Count);

بالمختصر: لازيليستu003CT> يعمل فقط مع iqueryableu003CT> ، كسولu003CT> يعمل مع أي نوع.

لازيليستu003CT> هو لحالة الاستخدام المحددة عندما تريد نتائج iqueryableu003CT> كقائمةu003CT> ، لكنك لا تريد أن يحدث التقييم حتى تستخدمه.


تحديث للإجابة على السؤال الموسع:

هل توصي بواحد على الآخر إذا أردت العمل على iqueryable كقائمةu003CT> ؟ أفترض ذلك منذ كسولu003CT> هل هو في الإطار الآن ، إنه رهان أكثر أمانًا للدعم المستقبلي والقابلية للصيانة؟

أنا شخصياً لن أستخدم أيضًا. إذا كنت قد حصلت على iqueryable ، فسأحتفظ بها كإيكري لزيادة مرونتك إلى الحد الأقصى. من خلال الحفاظ على iQueryable ، لا يزال بإمكانك الوصول إلى LINQ لفهم استعلام SQL (طالما أن السياق لا يزال على قيد الحياة).

على سبيل المثال ، إذا اتصلت .tolist () على iqueryable ، فأنت تطلب الكل من الأعمدة من الجدول المستهدف والهيدرات الكل من النتائج (قد يكون هذا مكلفًا للغاية ، خاصة إذا كان لديك آلاف النتائج). سيتم ترجمة هذا إلى شيء مثل "Select * from Mytable".

إذا اتصلت .count () على iqueryable ، فأنت تطلب من LINQ إلى SQL الحصول على عدد النتائج فقط ، فسيتم ترجمة هذا إلى شيء مثل "تحديد العد (*) من mytable". يعد القيام بذلك أكثر كفاءة من ترطيب جميع النتائج ثم حسابها ، خاصة إذا كنت مهتمًا فقط بالرقم!

باستخدام. where () على linq iqueryable إلى SQL ، ستضيف شروطك إلى الشرط في استعلام SQL. هذا يعني أنك ستقوم بسحب البيانات فقط من SQL التي تهتم بها ، بدلاً من ترطيب النتائج التي ليس لديك أي نية لاستخدامها.

كما ترى ، من خلال الحفاظ على iqueryable ، تجعل الأمور أكثر مرونة لنفسك. معظم الوقت سوف يمنحك أداء أفضل من ترطيب مجموعة النتائج بأكملها.

إذا كنت أرغب في استخدام نوع قوي بدلاً من نوع مجهول (VAR) هل ستكون العبارات التالية مكافئة وظيفيًا؟

Lazy<List<Product>> products = new Lazy<List<Product>>(); 
LazyList<Product> products = new LazyList<Product>();

أعتقد أنك تحصل على كتابة مجهولة في الخلط بين الكتابة الضمنية. يتم كتابة متغير معلن باستخدام الكلمة الرئيسية VAR ضمنيًا لمطابقة النوع الذي يتم تعيينه إليه. هو - هي هو كتبت بقوة وبالتالي لا يمكن تغييرها بعد المهمة الأولية.

البيانين غير متكافئين وظيفيا. لازيليستu003CProduct> هو ilistu003CProduct> ، حيث كسول u003CListu003CProduct> > غلاف يحتوي على قائمةu003CProduct> . لأنك مهتم على وجه التحديد بالعمل على قائمة تقييم كسول ، أقول إن Lazylist المحتمل أكثر تحديدا لأغراضك.

يجب أن تسأل نفسك إذا كنت حقًا تحتاج إلى قائمة فعلية من المنتجات. إذا لم يكن هناك سبب مقنع لوجود قائمة فعلية ، فسألتزم بـ Iqueryable.

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