چند روز پیش یک کد دیدم که توش خیلی جالب با دستور lambda مستقیم روی خروجی دستور حرکت کرده بود و دیگه از foreachاستفاده نکرده بود،
تابع ForEach یکی از توابع خیلی جالب در entity framework است که من جدیدا باهاش افتخار آشنایی داشتم
این دستور رو توی 2 جا استفاده کردم و واقعا عالی بود (کلی کد نویسیم خلاصه شد )

استفاده از تابع ForEach در Entity framework:

همانطور که گفتم این تابع بسیار جالب در 2 جا استفاده داره:

1- در زمان ثبت یک داده در دیتابیس وقتی که می خوایم همزمان 2 جدول رو با هم پر کنیم که ارتباط یک به چند یا چند به چند دارند

فرض کنین که ما دو تا جدول با نام های Manager و NewsCat داریم که ارتباط چند به دارند.
بدین صورت که هر مدیر می تونه فقط توی موضوعاتی که براش مشخص شده خبر ارسال کنه (یه جور سیستم سطح دسترسی است)

دیاگرام دیتابیس ما این شکلیه:

مقالات آموزشی دانشجویی برنامه نویسی و الکترونیک و شبکه

در اینجا ما می خواهیم هر NewsCat جدیدی که ثبت می گردد ، همزمان درون جدول وسط نیز برای تمامی مدیران ارشد سایت نیز ثبت گردد تا بدین صورت هرگاه یکی از مدیران ارشد دسته بندی جدیدی ثبت می نماید ، دسترسی دسته بندی جدید به همه مدیران ارشد دیگر هم داده شود.

برای این کار کافی است در زمان ثبت NewsCat جدید ، به ازای هر یک از مدیران ارشد سایت یک رکورد در جدول وسط (Manager_NewsCat) ثبت نماییم تا سایر مدیران ارشد دسترسی ارسال خبر در دسته بندی جدید را داشته باشند.

برای این کار باید بصورت زیر کد بنویسیم:


ابتدا باید یک Instance از کلاس NewsCat بسازیم و پراپرتی مورد نیازش را پر کنیم.

سپس روی جدول مقابل (Manager) یک foreach جالب می زنیم و به ازای تک تک مدیران ارشد (Where(c => c.IsAdmin == true یک Instance از کلاس Manager_NewsCat را به آن اضافه می نماییم.

در پایان Instance را به کانتکس E.F اضافه و همه تغییرات را ذخیره می کنیم.

کد بالا 2 نکته جالب دارد:
1- دیگه نیومدیم اطلاعات مدیران ارشد رو بگیریم و بریزیم توی یک متغیر و بعد روش Foreach سی شارپی بزنیم (دستور Foreach سی شارپ) و ...
بلکه یهو با کمک دستورات Lambda و تابع ForEach مستقیم این کار رو انجام داده ایم.

2- کل این همه رکورد رو فقط با یکبار استفاده از تابع SaveChanges انجام داده ایم ! که این یعنی همه چی رو اول روی کش داریم اضافه می کنیم و در پایان این همه رکورد رو به یکبار کانکت به به دینابیس ، در دیتابیس می ریزیم (قابل توجه دوستانی که به دنبال بهینه سازی کداشون هستند)
دقت کنین که همیشه در Entity FrameWork برای اینکه با یک بار SaveChanges بتونین اطلاعاتتونو روی توی دیتابیس ذخیره کنین ، باید از رکورد مورد نظرتون یک Instance بسازین و سپس با کمک Navigate Property ها رکورد های دیگرتونو به این Instance اضافه می کنین و در پایان Instance تونو به کانتکس E.F اضافه می کنین و سپس با یکبار اجرای تابع SaveChanges کل رکوردها رو توی دیتابیس می ریزید.
و این است قدرت Entity FrameWork
 
مقالات آموزشی دانشجویی برنامه نویسی و الکترونیک و شبکه

2- در زمانی که مثلا قراره یک رکورد رو پاک کنیم که در یک جدول دیگر کلی رکورد داریم که به این وابسته است
یکی دیگر از مواقعی که تابع ForEach عزیز رو میشه استفاده کرد ، وقتیه که مثلا من می خوان یک مدیر (Manager) رو حذف کنم و دوست هم ندارم که توی دیتابیسم رابطه بین جداولم رو Cascade کنم.

مثلا برای حذف یک مدیر داریم:



با فرض اینکه آی دی مدیری که قرار حذف بشه رو داریم (نحوه بدست آوردن آی دی کسی که قرار حذف بشه خارج از بحث ماست)

به راحتی رکورد مدیر مورد نظر رو بدست میاریم و سپس با تابع Foreach و با کمک Navigate Property ها روی Manager_NewsCat های اون حرکت و همه رو از کانتکس حذف می کنیم و در پایان خود مدیر رو هم حذف می کنیم و سپس تغییرات رو روی دیتابیس اعمال می کنیم.

امیدوارم آموزش بالا خودشتون اومده باشه و از این به بعد کداتونو بهینه تر و زیباتر و کوتاه تر بنویسین
موفق باشید

نوشته شده در تاریخ جمعه 19 اردیبهشت 1393    | توسط: ح.م    | طبقه بندی: آموزش Entity Framework،     | نظرات()