خوب ارتباط یک به چند داریم توی post یعنی یک پست میتونه چندین تا comment و چندین تا Tag داشته باشه و یک relation هم با catogery داره
هر catogery ارتباط یک به چند با هر پست داره
در قسمت comment هم ارتباط داره با post و user
قسمت tag هم ارتباط یک به چند داره با post
اینجا با دستور tolist اومدیم دیتا های post رو از دیتابیس گرفتیم و بعد ریختیمش توی post
#toList
حالا ما میخوایم دستورات sql که توسط ef ایجاد میشن رو ببینیم ، برای این کار میایم از toQueryString استفاده میکنیم #toQueryString
یه روش دیگه استفاده از sql profiler خوده sql server استفاده کنیم #sqlProfiler
بعد از connect شدن به اون سروری که میخوایم
تمامی query هایی که روی این دیتابیس اعمال شده رو به ما نشون میده
حالا میام یه query مینویسیم که بریم اونور چک کنیم
خوب حالا میتونیم برای query هایی که توسط ef اجرا میشن میتونیم comment بنویسیم که موقع debugging ازش استفاده کنیم
اینجوری کامنت هم براش مینویسیم
#TagWith
دستورات linq رو هم میتونیم استفاده کنیم
خوب حالا دوباره برمیگردیم به همین دستور :
اینجا دیتای post فقط لود شده ولی دیتا هیچکدوم از relation هایی که داریم لود نشده برای لود کردن این موارد چند تا روش داریم
این روش اسمش eager loading هستش : #EagerLoading
اینطوری قسمت کامنت های پست ها هم باهاش لود میشن خوب برای لود کردن بقیه realtion ها میتونیم اون های دیگه رو هم include کنیم #include
حالا به طور مثال اینجا میخوایم وقتی که کامنت ها لود شد بریم ببینیم این کامنت توسط کدوم user نوشته شده
#thenInclude
از دستور then include استفاده میکنیم خوب میخوایم کامنت ها رو لود کنیم و بریزیم توی یه لیست
خوب اینجا یه دستور خیلی طولانی از tsql ها نوشته شده ، ولی در ef این قابلیت رو داریم که بیایم یه کاری کنیم که تیکه تیکه بهمون نشون بده و این باعث میشه که performance بهتری داشته باشیم برای این کار باید از asSplitQuery استفاده میکنیم
اینجا یه بار پست ها رو لود کرده
یک بار هم کامنت ها رو
خوب حالا فرض کنیم که میخوایم از بین 1000 تا کامنت فقط 800 تاش که تاییدشده اند رو بگیریم برای این کار باید بیام فیلتر بزنیم :
میرسیم به مدل expilicit loading اینجا وقتیه که اول میام یه پست رو لود میکنیم و بعد میخوایم اگر مثلا یه شرطی برقرار بود بعدش بیایم کامنتهاش رو لود کنیم خوب همونطوری که میبینید post با comment رابطه چند تایی داره برای همین میایم از collection استفاده میکنیم برای post با category چون تکی هستش رابطه اش از reference استفاده میکنیم
explicit_Loading #entry #Load #Query #Count #refrence
خوب نکته ای که وجود داره وقتی که ما میخوایم فقط تعداد کامنت ها رو لود کنیم این روش درست نیست که بیایم کل دیتا کامنت ها رو بگیریم و لود کنیم توی برنامه و فقط بیایم تعدادش رو استفاده کنیم چون این باعث اضافه و سربار در برنامه میشه
خوب راه حلی که هست اینه که یا بیایم تعداد کامنت ها رو با یه query جدا بگیرم بهتره که اینطوری بیایم بنویسیم
و حتی میتونیم تعیین کنیم که کامنت هایی که فقط تایید شده اند رو نشون بده
خوب این قضیه explicit loading برای زمانی که include و then include به ef اضافه نشده بود استفاده میشد و بعدش دیگه نیازی به این مدل لود کردن دیتا ها به این شکل نداریم الان با استفاده از include و then include میایم همونجا شرط هایی که میخوایم دیتا لود بشن رو مینویسیم و ازشون استفاده میکنیم این قابلیت از ef 5 به بعد اضافه شده حالا بازم اگر شرط خاصی بود میتونیم از همین استفاده کنیم ! #lazy_Loading روش lazy loading توی این روش میاد وقتی که ما مثلا یه پست رو لود میکنیم خودش میاد اتوماتیک تمام relation های مرتبط با اون رو میاد لود میکنه
با این روش روی تمام query ها lazy loading اعمال میشه
نکته ای که داره اینه که برای استفاده ازش باید بر روی تمامی روابط باید virtual رو اضافه کنیم
#virtual
و بقیه شون هم باید virtual رو داشته باشن
خوب حالا فرض کنید که برای post فقط میخوایم قسمت comment اش رو لود کنیم :
خوب اول که اون قسمتی که توی option builder هستش رو پاک میکنم و بعد میایم اینجوری مینویسیم
اول باید یه backing field برای comment درست کنیم، اینطوری که با استفاده از _ خوده convention ها تشخیص اش میده
اینجا اومدیم یه نمونه از Ilazyloader درست کردیم و بعد اومدیم تزریق وابستگی رو انجام دادیم
بعد میام get و set اش رو هم اینطوری تعیین میکنیم
توی entity هم میشه تزریق وابستگی انجام داد
خوب اینجا کامنت ها لود شده ولی بقیه relation ها لود نشدن