متى السجلات من الجداول المرتبطة محملة LINQ2SQL
-
21-08-2019 - |
سؤال
دعونا نقول لدي جدولين:
- تقرير
- التعليق
وعلى افتراض لدي سياق قاعدة البيانات:
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 الاستعلامات.