relation

خوب ارتباط یک به چند داریم توی 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 استفاده میکنیم

اینجا یه بار پست ها رو لود کرده

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 ها لود نشدن