DotNetZoom
3.06K subscribers
342 photos
18 videos
36 files
606 links
DotNetZoom
💎 Everything about .NET

ارتباط با مدیر و تبلیغات آگهی استخدام:
@mjebrahimi

لینک گروه ASPNET Core:
https://t.me/+ufG25x7lVFgyYTNk
Download Telegram
#EntityFramework, #EFCore, #LazyLoading

همان طور که میدانیم در اِنتیتی فریم ورک، سه روش برای لود نمودنِ اطلاعات مربوط به یک اِنتیتی وجود دارد. به طور کلی، بر اساسِ این نیاز که آیا برای دریافتِ اطلاعاتِ بینِ جداول، باید Join صورت پذیرد یا خیر، نوع واکشی را مشخص میکنیم.
برای این منظور سه الگوی مشترک بین ORM ها به قرار زیر است:
- Eager loading
- Explicit loading
- Lazy loading
بسته به نوع نیاز ممکن است هر یک از روش های فوق مورد استفاده قرار گیرند.

در EF Core هم به صورت مشابه، رویه به همین منوال برقرار است، با این تفاوت که فعلا خبری از Lazy loading نیست و باید به طور واضح، اِنتیتی فریمورک را نسبت به لود دیتای مورد نیاز از طریق include آگاه نمود.

var blogs = context.Blogs

    .Include(blog => blog.Posts)

    .ToList();


هم چنین واکشی اطلاعات تا چند سطح از طریق متد ThenInclude باید انجام شود و برخلاف EF6 که واکشی چند سطحی در متد include و به وسیله ارسال پارامتر از نوع استرینگ (Include("Posts.Comments")) صورت میگرفت در نسخه ی کور باید از متد ThenInclude استفاده گردد:

var blogs = context.Blogs

    .Include(blog => blog.Posts)

        .ThenInclude(post => post.Comments)

    .ToList();


فیلم زیر در channel 9 از سری مجموعه های ASP .NET Monsters Episode این قابلیت را به صورت عملی شرح میدهد:
https://channel9.msdn.com/Series/aspnetmonsters/ASPNET-Monsters-Episode-57-Loading-Related-Data-with-Entity-Framework-Core

@IranAspMvc
#EF , #EntityFramework , #LazyLoading , #EagerLoading

مساله ی Select N+1 چیست و چطور باعث کاهش کارایی ORM می شود؟

استفاده از تکنولوژی های جدید به همان اندازه که میتواند به کمک توسعه دهنده بیاید و یک کدنویسیِ راحت و لذت بخش را برای وی رقم بزند، به همان اندازه هم در اثر دانش کم و استفاده ی نادرست می تواند مخرب باشد، مخصوصا اگر موضوعِ تکنولوژی، ارتباط مستقیمی با پرفرمنس و کارایی برنامه ی شما داشته باشد.

یکی از مشکلات و خطاهای رایج در استفاده از EF، خطای select n+1 است، که به وفور در کدهای توسعه دهندگانِ ناوارد یافت می شود. به این معنی که شما به جای اجرای یک کوئری، n+1 کوئری را اجرا میکنید و در نتیجه ی آن، n+1 رفت و برگشت به بانک اطلاعاتی خواهید داشت! و این مشکل به دلیل فعال بودن خاصیت lazy loading و اجرای حلقه روی مجموعه ای از داده ها که دارای رابطه ی master-detail هستند، اتفاق می افتد. به عنوان مثال تصور کنید یک کلاس Department داریم و هر دپارتمان هم تعدادی Course دارد:

public class Department

    {

        ....

        public virtual ICollection<Course> Courses { get; set; }

    }


public class Course

    {

        ....

        public virtual Department Department { get; set; }

    }


در این صورت، با اجرای حلقه ی زیر و فعال بودن خاصیت lazy loading مشکل select n+1 به وجود می آید:

using (var context = new SchoolEntities())

{

  foreach (var department in context.Departments)

  {

    foreach (var course in department.Courses)

    {

      Console.WriteLine("{0}: {1}", department.Name, course.Title);

    }

  }

}


بنابراین، در حالتی که با تعداد بالایی داده رو به رو باشیم، استفاده ی نادرست از lazy loading به شدت روی پرفرمنس تاثیر گذار است. راه حل این مشکل استفاده از متد Include برای اعمالِ جوینِ بین جدوال است، تا اطلاعاتِ موجودیت های مرتبط به صورت همزمان و از طریق Eager loading واکشی شوند:

using (var context = new SchoolEntities())

{

  foreach (var department in context.Departments.Include("Courses"))

  {

    foreach (var course in department.Courses)

    {

      Console.WriteLine("{0}: {1}", department.Name, course.Title);

    }

  }

}


در این حالت فقط یک رفت و برگشت به بانک اطلاعاتی خواهیم داشت و EF خودش Join لازم را برای واکشیِ اطلاعاتِ مرتبط، در پشت صحنه انجام می دهد.

اطلاعات بیشتر:
http://www.codeproject.com/Articles/102647/Select-N-Problem-How-to-Decrease-Your-ORM-Perfor

@IranAspMvc