خب سلام.
وقتی ما از Eager Loading (همون include و thenInclude ) در Ef Core استفاده می کنیم با یک مشکلی تحت عنوان cartesian explosion مواجه می شیم. این موضوع مربوط به اینه که وقتی ما join میزنیم ، دیتاهای تکراری زیادی برای هر join زدن میگیریم. اکثر مواقع این دیتا های تکراری بخوبی مدیریت میشن ولی بعضی وقتا تعدادشون خیلی زیاد میشه و از نظر پرفورمنسی بهمون صدمه میزنن.
یک راه حل برای حل این مشکل اینه که کوئری که قصد داریم بزنیم رو به چند کوئری بشکونیم (زمانی که داریم کوئری رو میفرستیم سمت دیتابیس) و موقع برگشتن دیتا ، نتایج رو به هم متصل کنیم .
توی ورژن 5ام از Ef Core یک تابع با نام AsSplitQuery اومد تا این کارو برای ما انجام بده.
نحوه استفاده کردن ازش در بالا اومده.
خب حالا یک تصویر نشون میدم و بعدش دربارش صحبت می کنیم.
خب توی بخش اولی ، ما به صورت عادی نوشتیم includeمون رو. نتیجه ای که بهمون برمیگردونه رو هم توی بخش 1 می بیینیم. دور دیتاهای تکراری با رنگ قرمز خط کشیده شده . مشخصا الان تعداد این دیتا های تکراری کمه ولی اگر join های بیشتری و تودرتو داشته باشیم ، این تعداد زیاد میشه و میتونه باعث بروز مشکل برای ما بشه
خب حالا بخش پایینی رو نگاه کنید یعنی بخش 2. توی این بخش از AsSplitQuery استفاده شده. خب همون طوری که می بینید این متد باعث میشه که 2 تا کوئری ایجاد بشه برای درخواست ما (تعدادش اینجا 2 تاس ن بصورت کلی 2 تا و ممکنه بیشترم باشه). نتایجی هم که برمیگردونه بصورت جدا از هم هستند و Ef Core این نتایج رو با هم ترکیب میکنه.
دو نکته برای استفاده از AsSplitQuery وجود داره.
موفق باشید.
:)