سؤال

دعونا نقول لدي جدولين:

  • تقرير
  • التعليق

وعلى افتراض لدي سياق قاعدة البيانات:

var reports = db.Reports();

كيف يمكنني التأكد من جميع تعليقات على كل تقرير يتم تحميلها ؟

عند هذه النقطة أريد أن افصل من قاعدة البيانات ولكن لا يزال الوصول إلى التعليقات.(على سبيل المثال:)

reports[0].Comments[0].Subject
هل كانت مفيدة؟

المحلول

أنا على افتراض أن هناك 1-م FK العلاقة بين التقارير والتعليقات (1 التقرير يمكن أن يكون العديد من التعليقات)?

خيار واحد هو استخدام DataLoadOptions.LoadWith الطريقة - شيء كما يلي:

var reports = db.Reports();
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Reports>(r => r.Comments);      // Ask for Comments along with reports
reports.LoadOptions = dlo;

الآن في كل مرة قمت بتحديد التقرير على أن البيانات السياق التعليقات سوف يتم جلبه من قاعدة البيانات جنبا إلى جنب مع ذلك.

فقط حذار من أن جميع الحقول من التعليقات وسيتم اختيار - لا توجد طريقة استخدام هذا الأسلوب لتحديد مجموعة فرعية من المجالات.

وثمة خيار آخر هو أن تكون محددة حول ما تريد تحديدها في Linq الاستعلام مثلا

var myReportsList = from report in db.Reports
                    select new {  // Using anonymous type, but could use a custom class
                       Report = report,
                       Comment = report.Comment.Detail,   // for example
                       Subject = report.Comment.Subject
                    };

فهم عند الاستعلام يحصل تشغيل اتصال قاعدة البيانات مغلقة, سوف تحتاج إلى فهم:

  • المؤجلة نموذج التنفيذ من Linq و Linq To Sql (أساسا ، Linq to SQL الاستعلام يعمل فقط عندما تكون النتائج طلبت مثلاقبل بالتكرار على جمع أو الربط إلى الشبكة)
  • الفرق بين IQueryable و IEnumerable

جون سكيتس "C# في العمق" يعطي لمحة كبيرة من هذه و سمعت أيضا أشياء جيدة جدا حول "Linq في العمل" - بالإضافة إلى أن هناك الكثير من بلوق وظيفة حول هذه المفاهيم التي مواضيع أكثر عدالة مما أستطيع القيام به هنا ؛ o)

نصائح أخرى

نضع في اعتبارنا أنه إذا كنت تستخدم LoadOptions لتحديد متعددة هوب المسار (التقارير والتعليقات anotherentity) ، 3rd مزيد من القفزات يتم تحميلها (إذا كان أكثر من 1:n العلاقات) من التعليمات البرمجية التي هي فعالة جدا:سوف تنفيذ استعلام واحد في الأصل.تقارير-التعليقات, لا بأس, سوف يكون المنال في 2 الاستعلامات.

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