دوره آموزشی Entity FrameWork Core - قسمت 24
خوب Explicit Loading در EF Core تکنیکی است که ما موجودیت های مرتبط را با یک فراخوانی صریح، پرس و جو و بارگذاری می کنیم. بارگذاری صریح بسیار شبیه به بارگذاری تنبل است، اما بارگذاری موجودیت های مرتبط تنها پس از فراخوانی صریح با متد Load یا Query شیء (...)API DbContext.Entry موجودیت مرتبط انجام می شود.
به عبارتی دیگر بارگذاری صریح به این صورت تعریف می شود: هنگامی که اشیاء توسط یک پرس و جو برگردانده
می شوند، اشیاء مرتبط به طور همزمان بارگذاری نمی شوند. بهطور پیشفرض، تا زمانی که صریحاً با استفاده از متد Load در یک navigation property درخواست نشود، بارگذاری نمیشوند.
شما می توانید Explicit loading یک navigation property را با DbContext.Entry(...) API انجام دهید.
using (var context = new BloggingContext()) { var blog = context.Blogs .Single(b => b.BlogId == 1); context.Entry(blog) .Collection(b => b.Posts) .Load(); context.Entry(blog) .Reference(b => b.Owner) .Load(); }
همچنین میتوانید با اجرای یک کوئری جداگانه که موجودیتهای مرتبط را برمیگرداند، مشخصاً یک
navigation property را بارگیری کنید. اگر change tracking فعال باشد، هنگامی که یک پرس و جو یک موجودیت را تحقق می بخشد، EF Core به طور خودکار navigation propertyهای موجودیت تازه بارگیری شده را تنظیم می کند تا به هر موجودیتی که قبلاً بارگذاری شده است اشاره کند و navigation propertyهای موجودیت های بارگیری شده را برای رجوع به آن تنظیم می کند.
در مثال بالا از متد ()Reference برای به دست آوردن یک شی از reference navigation property مشخص شده استفاده می شود و متد ()Load آن را به صراحت بارگذاری می کند.
به همین ترتیب از متد ()Collection برای بارگیری ویژگی navigation property پست های موجودیت blog استفاده می شود. متد ()Collection یک شی دریافت می کند که نشان دهنده
collection navigation property است.
متد ()Load کوئری SQL را در پایگاه داده اجرا می کند تا داده ها را دریافت کند و reference یا collection propertyهای مشخص شده را در حافظه پر کند.
همچنین می توانید پرس و جوهای LINQ را بنویسید تا داده های مرتبط را قبل از بارگیری فیلتر کنید.
متد ()Query ما را قادر میسازد تا کوئریهای LINQ بیشتری را برای موجودیتهای مرتبط بنویسیم تا دادههای مرتبط را فیلتر کنیم.
اعمال یک فیلتر بر روی موجودیت های مرتبط بدون بارگذاری آنها در حافظه :
using (var context = new BloggingContext()) { var blog = context.Blogs .Single(b => b.BlogId == 1); var postCount = context.Entry(blog) .Collection(b => b.Posts) .Query() .Count(); }
همچنین میتوانید موجودیتهای مرتبط را که در حافظه بارگذاری میشوند، فیلتر کنید:
using (var context = new BloggingContext()) { var blog = context.Blogs .Single(b => b.BlogId == 1); var goodPosts = context.Entry(blog) .Collection(b => b.Posts) .Query() .Where(p => p.Rating > 3) .ToList(); }
در صورتی که از Lazy Loading استفاده نمی کنید و از قبل مطمئن نیستید که از یک موجودیت استفاده خواهید کرد یا خیر، از Explicit loading استفاده کنید.
بیشتر بخوانید : دوره آموزشی Entity FrameWork Core - قسمت 26
بیشتر بخوانید : دوره آموزشی Entity FrameWork Core
بیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Core