يتم الوصول إلى الصفوف مع بيانات فارغة عبر LinQ مما تسبب في مهلة؟ كيفية إصلاح؟

StackOverflow https://stackoverflow.com/questions/1171104

سؤال

لدي عدد من الجداول في SQL. واحد هو ضوابط (نوع كائن CRUD نموذجي) وواحد المرفقات. المرفقات المراجع ضوابط عبر FK (يمكن أن يكون هناك العديد من المرفقات). المرفقات يتضمن أيضا، من بين أشياء أخرى، اسم وعمدة فارغية مع بيانات الملفات.

من خلال LinQ، مراقبة لديه خاصية المرفقات.

لدي عرض عناصر تحكم (MVC) يعرض الكثير من المعلومات، بما في ذلك قائمة المرفقات الموجودة. يتم إجراء هذه القائمة عبر طريقة مساعد:

public static string FileBox(this HtmlHelper helper, string name, IEnumerable<Models.Attachment> files, bool writable)
    { ... }

هذه الحلقات الوظيفة من خلال المرفقات ويكتب قائمة غير مرتبة مع أسماء المرفقات.

نادرا ما، أحصل على خطأ مهلة، وهنا مقتطف من هذا الخطأ:

System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

...

at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
   at System.Data.Linq.EntitySet`1.Load()
   at System.Data.Linq.EntitySet`1.GetEnumerator()
   at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
   at IRSoxCompliance.Helpers.Html.FileBox(HtmlHelper helper, String name, IEnumerable`1 files, Boolean writable) in C:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\IRSoxCompliance\IRSoxCompliance\IRSoxCompliance\Helpers\Html.cs:line 228
   at ASP.views_edit_control_edit_test_aspx.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in c:\inetpub\wwwroot\Views\Edit\Control_Edit_Test.aspx:line 109

...

لذا...

  1. هل أنا صحيح أن أفترض أن هذه المهلة ترجع إلى حقيقة أنه في حين تم تحميل عنصر التحكم بالفعل المرفقات يتم تحميل الصفوف كسول، ولا يتم تحميلها فقط من المساعد؟ وأن هذا يرجع في الغالب إلى حقيقة أنني أمسك بها ربما 50 ميغابايت من البيانات التي لا أحتاج إليها؟

  2. كيف يمكنني منع هذا؟ أ) أود تجنب تقسيم الجدول. ب) هل يمكنني إنشاء خاصية جزئية للمرفقات على عنصر التحكم الذي يقوم بإرجاع فئة جديدة تحتوي على كل شيء سوى الثنائي؟ ج) يبدو أنه يمكنني تشغيل "تأخير تحميل" على العمود الثنائي فقط. هل سيعمل هذا؟ إذا كان الأمر كذلك - لقد قمت بنقطة عدم تغيير أي شيء في DBML، لأن لدي عادة تطهير جدول ثم إعادة التحميل. لذلك سأفقد هذا الإعداد. هل هناك أي طريقة للتأكد من أنني لا أفقدها؟ هل يمكنني تعيينها من جزئي؟ أو ربما اختبار الوحدة التي يمكن أن تؤكد أنه قيد التشغيل؟

المحلول: بناء على الجواب، أدركت أنه بدلا من:

foreach (Attachment file in controls.Attachments) {
  response.write(file.name);
}

يمكنني بدلا من ذلك:

foreach (string filename in controls.Attachments.Select(a => a.name)) {
  response.write(filename);
}

على الرغم من أنني انتهيت من إرجاء عمود Varbinary، على أمل أن ألا أنسى أن أعرض هذا الخيار مرة أخرى يجب علي إعادة تعيين ملف DBML الخاص بي.

شكرا جيمس

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

المحلول

  1. أنت على حق أن LinQ كسول تحميل المرفقات الخاصة بك. سواء أكان تشغيل البيانات المتنوعة أم لا، تعتمد ذلك من قاعدة البيانات على الاستعلام. يمكنك نشر ذلك؟

  2. لا تحتاج إلى تغيير هيكل قاعدة البيانات الخاصة بك لفرز المشكلة. تأكد من أن الاستعلام الخاص بك لا يلمس حقل varbinary - ستحتاج إلى تحديد / إسقاط مناسب لضمان ذلك. أيضا إذا كنت تعرف أنك ستحصل دائما على جميع المرفقات المتعلقة بوحدة التحكم، فيمكنك استخدام LoadWith لإرشاد LinQ للحصول على كل مرة بدلا من التحميل كسول عند الطلب. سيؤدي ذلك إلى خفض عدد رحلات قاعدة البيانات الرحلة المطلوبة للحصول على الوظيفة.

تحميل معلومات على MSDN

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

للحصول على بعض البصيرة الحقيقية في ما يجري في محلل QQL Query في قاعدة البيانات الخاصة بك ثم قم بتشغيل التعليمات البرمجية. سترى بالضبط ما يضرب SQL قاعدة البيانات ويمكنه الاستيلاء عليه وتشغيله في Studio الإدارة لمعرفة ما يتم سحب البيانات بالضبط.

آمل أن يساعد هذا قليلا.

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