تبلیغات
مقالات آموزشی برنامه نویسی و شبکه - مطالب آموزش Entity Framework

آموزش نحوه دریافت داده با استفاده از Entity Framework

دریافت داده یکی از پر کاربردترین کارهای برنامه نویسان می باشد، شاید بتوان گفت "برنامه نویسی چیزی به جز بازی با داده ها نیست" و بنده کاملا به این جمله معتقدم ؛ زیرا اگر به نرم افزارهای اطراف خود به دقت توجه نمایید ، متوجه این نکته می شوید که همه نرم افزارها کاری به جز بازی با داده انجام نمی دهند، از این رو عملیات CRUD بین برنامه نویسان بسیار گفته می شود ، به طوری که اگر به صحبت های چند برنامه نویس گوش کنید احتمال شنیدن عبارت CRUD در بین جملات آنها بسیار زیاد می باشد...
CRUD چهار عمل اصلی است که روی داده ها انجام می شود و شامل CREATE ، READ (Retrieve) ، UPDATE و DELETE می باشد ، در نهایت بقیه کاری که در نرم افزارها ممکن است انجام شود،  عملیات های محاسباتی می باشد.
Entity Framework یک پترن بسیار جذاب برای برنامه نویسان می باشد که با بررسی دقیق آن متوجه می شویم که Context آن نوعی پترن با نام Unit Of Work می باشد. (برای اطلاعات بیشتر درباره این پترن بسیار جذاب می توانید به اینجا مراجعه نمایید)
در ادامه در این پست آموزشی درباره عملیات READ صحبت خواهیم نمود و دریافت اطلاعات از منبع داده (دیتابیس) با کمک Entity Framework را بررسی خواهیم نمود.

در Entity Framework توابعی برای دریافت اطلاعات وجود دارند که عبارتند از:
First - FirstOrDefault - Single - SingleOrDefault - Find - ToList

اولین نکته ای که می توان درمورد توابع فوق بیان نمود این است که اجرای این دستورات موجب اجرا یک کد SQL روی دیتابیس می شود و در نتیجه خروجی این توابع داده می باشد.
من به شخصه دوست دارم اسم این توابع را توابع اجرایی بنامم ، زیرا این توابع موجب اتصال به دیتابیس و اجرای یک کد SQL روی آن و دریافت اطلاعات از دیتابیس می شوند.
در توضیح بیشتر باید بیان نمایم که خروجی تمامی توابع Entity Framework الزاما داده نیست و بسیاری از توابع خروجی از نوع IQueryable می باشد ، IQueryable در اصل دستور SQL می باشد و بنابراین داده نیست و برای تبدیل شده به داده می بایست بوسیله یکی از توابع فوق روی دیتابیس اجرا شوند.
شاید بپرسید "خوب ، خروجی IQueryable به چه درد ما می خوره ؟"
در جواب باید خدمتتون عرض کنم که این نوع خروجی یکی از جاذبه های Entity Framework می باشد ، بطوری که شما می توانید چندین خروجی را با هم ادغام نمایید
به تکه کد زیر توجه نمایید :


در خط اول تکه کد بالا  از کانتکس Entity Framework یک شیء ایجاد کرده ایم.

در ادامه ملاحظه می نمایید که درون query1 و query2 و query3 داده ای وجود ندارد و همه آنها حاوی دستور SQL می باشند (نوع این اشیاء IQueryable است)

خاصیت جالب اشیاء IQueryable این است که می توانید روی آنها شرط جدیدی بگذارید و در نتیجه شیء جدیدی از نوع IQueryable ایجاد نمایید ، بدون اینکه سرباری روی سرور داشته باشید (تا وقتی روی اشیاء IQueryable کار می کنید و از توابع اجرایی بیان شده در ابتدای این مقاله استفاده نمی نمایید ، هیچ اتصالی به دیتبایس انجام نمی شود و در نتیجه هیچ سرباری روی سرور نخواهید داشت)

به شخصه بیشترین استفاده ای که از IQueryable کرده ام ، ایجاد کوئری های پویا در جستجوی های پیشرفته بوده است ، بصورتی که شما می توانید بصورت پویا بر اساس پر بودن فیلدهای فرم جستجویتان به کررات شرط هایی به شیء IQueryable تان اضافه نمایید و در پایان شیء حاصل را توسط توابع اجرایی روی دیتابیس اجرا نمایید و خروجی آن را (که مسلما داده است) درون صفحه به کاربرتان نمایش دهید.

در کد فوق بنده در خط آخر به کمک تابع اجرایی ToList موجب اجرای دستور SQL موجود در شیء query3 بر روی دیتابیس شده ام و در نتیجه خروجی من از نوع داده است.

نکته جالب استفاده از IQueryable این است که Where های شما با هم AND می شوند و در اصل 2 دستور زیر با هم برابرند :



در کد فوق query2 و query3 با یکدیگر برابر می باشند.


حال که به اهمیت IQueryable اشاره ای داشتیم و تفاوت توابع غیر اجرایی مانند Where و OrderBy را با توابع اجرایی مانند ToList و First فرا گرفتید، بهتر است به موضوع اصلی این پست که تفاوت توابع اجرایی با یکدیگر است بپردازیم.

تابع First :
این تابع فقط در زمانی استفاده می شود که مطمئن باشید خروجی این تابع یک رکورد (یک شیء) یا بیشتر از یک رکورد می باشد ، بنابراین اگر خروجی نال باشد (هیچ رکوردی بر نگشته باشد) تابع Exception آزاد خواهد کرد.
معمولا به دلیل حساسیت بالای این تابع و امکان بروز خطا (Exception) خیلی کم از این تابع استفاده می نماییم.
دقت نمایید که این تابع معادل دستور TOP 1 در SQL می باشد و بنابراین در صورتی که خروجی شامل چندین رکورد می باشد این تابع اولین رکورد را برای ما برمی گرداند.

تابع FirstOrDefault :
این تابع همانند تابع First می باشد ، با این تفاوت که در صورتی که خروجی حاوی داده نباشد (هیچ رکوردی بر نگردد) تابع مقدار نال برمی گرداند و ارور نمی دهد.
معمولا در کدهایمان بیشتر تمایل داریم از این تابع استفاده نماییم ، به نحوی می توان گفت به دلیل عدم بروز خطا در این تابع ، این تابع بهترین تابع برای دریافت یک رکورد از دیتابیس می باشد. (در بین برنامه نویسان بیشترین کاربرد را این تابع دارد)

باید توجه داشته باشید که اضافه شدن OrDefault به اسامی توابع دلیل بر این مورد دارد که اگر خروجی تابع دارای هیچ داده (رکوردی) نباشد ، تابع مقدار پیش فرض که همانا مقدار نال (NULL) است را بر می گرداند.

نکته قابل توجه دیگر این است که از آنجایی که خروجی توابعی که درون اسم آنها عبارت OrDefault می باشد ممکن است مقدار نال باشد ، در استفاده از خروجی این توابع باید دقت نمایید و حتما قبل از استفاده از خروجی  نال نبودن خروجی را بررسی نمایید تا در زمان استفاده از آن به خطا بر نخورید

به تکه کد زیر توجه نمایید:


در کد فوق در صورتی که من شرط if را قرار ندهم ، در زمان استفاده از شیء data جهت پر کردن لیبل ها ، در صورتی که خروجی تابع FirstOrDefault مقدار نال باشد ، شیء data حاوی مقدار نال بوده و با خطا مواجه خواهیم شد.
مقالات آموزشی دانشجویی برنامه نویسی و الکترونیک و شبکه


تابع Single :
این تابع تقریبا عملکردی مشابه تابع First دارد ، با این تفاوت که معادل دستور TOP 1 در SQL نمی باشد و بنابراین دیگر همانند تابع First در مقابل خروجی های بیش از یک رکورد ایمن نمی باشد و در این صورت خطا (Exceprion) آزاد می نماید.
به بیان دیگر می توان گفت معادل بوذن دستور First با دستور TOP 1  در SQL این قابلیت را به تابع First داده است که در صورتی که با چندین رکورد مواجه شد ، اولین رکورد آن را برگرداند و بنابراین اروری نخواهیم داشت ، ولی در تابع Single ما باید فقط و فقط یک رکورد خروجی داشته باشیم و کمتر یا بیشتر از یک خروجی موجب بروز خطا (Exceprion) در کد ما خواهد شد که اصلا با ذائقه برنامه نویسان جور نیست

بنابراین باید بسیار در استفاده از این تابع دقت نمایید تا کد شما دچار خطا نشود.
(معمولا به دلیل احتمال بالای خطا در این تابع ، از آن استفاده نمی نماییم)


تابع SingleOrDefault :
این تابع مشابه تابع Single می باشد ، با این تفاوت که در برابر عدم وجود خروجی مقاوم است و دیگر ارور نمی دهد و مقدار نال بر می گرداند ، ولی کماکان در برابر تعداد بیش از یک رکورد در خروجی ضعف دارد و خطا می دهد.
همچنین همانطور که قبلا بیان شد ، توصیه می شود قبل از استفاده از خروجی توابعی که درون اسمشان OrDefault وجود دارد ، ابتدا نال نبودن خروجی را بررسی نمایید.
به تکه کد زیر توجه نمایید :


تابع ToList :
این تابع برای دریافت لیستی از رکورد ها می باشد و تعداد رکورد های خروجی اصلا برایش مهم نیست، بدین معنی که بدون خروجی ، یک رکورد و یا چندین رکورد اصلا برای آن اهمیتی ندارد و خروجی را در قالب یک کالکشن از نوع List جنریک بر می گرداند که می تواند شامل آیتم هایی باشد و یا خالی باشد.
این تابع برای دریافت لیستی از داده ها مناسب می باشد و برای دریافت یک رکورد استفاده نمی شود.

به تکه کد زیر توجه نمایید:


ملاحظه می نمایید که یکی از بهترین روش ها برای پر کردن کنترل های داده ای ، استفاده از تابع ToList می باشد.
مقالات آموزشی دانشجویی برنامه نویسی و الکترونیک و شبکه


تابع Find :
این تابع برای یافتن یک رکورد با کمک فیلد PrimatyKey می باشد ، تفاوت اصلی این تابع با بقیه توابع فوق این است که توابع فوق از درون دیتابیس داده را بر می گرداندند ولی این تابع از درون حافظ داده ها را بر می گرداند.
همانطور که می دانید EntityFramework یک نسخه از کل داده ها را روی حافظه کش می کند ، تابع Find در اصل درون کش EntityFramework را می گردد و داده مورد نظر را بر می گرداند.
البته بصورت دقیق نمی دانم که سیستم کش EntityFramework  به چه صورت می باشد و آیا حتما می توان انتظار داشت که همه اطلاعات دیتابیس درون کش EntityFramework  وجود داشته باشد ، ولی تا جایی که می دانم ، وقتی یک دیتایی را یکبار از طریق EntityFramework  از دیتبایس دریافت نمایید ، آن دیتا درون کش EntityFramework  قرار می گیرد.
(بررسی جزئیات دقیق تر این مورد را به خود شما می سپارم :دی )

تکه کد زیر طریقه استفاده از آن را نمایش می دهد:


توجه نمایید که باید حتما در ورودی تابع ، شرط مورد نظر را بر اساس ستون PrimaryKey دیتابیس بدهید.
همچنین باید توجه داشته باشید که در صورتی که خروجی یافت نشود، این تابع مقدار NULL را بر می گرداند ، بنابراین همانند توابعی که درون اسمشان عبارت OrDefault وجود داشت ، قبل از استفاده از خروحی این تابع نیز باید ابتدا نال نبودن خروجی را بررسی نمایید و سپس از خروجی آن استفاده کنید.

این تابع بین برنامه نویسان حرفه ای از محبوبیت زیادی برخوردار است و تنها ایرادش این است که فقط بر اساس ستون PrimaryKey می توان روی خروجی شرط گذاشت و برای گذاشتن سایر شروط باید از تابع Where قبل از آن استفاده نمایید.

نکته دیگر توابع اجرایی در نحوه استفاده از آنان می باشد ، همه توابع اجرایی فوق را می توانیم بصورت زیر نیز استفاده نماییم :

بصورتی که شرط فیلتر کردن خروجی را می توانیم در خود تابع وارد نماییم و دیگر نیازی به نوشتن تابع Where در قبل از آن نمی باشد ، البته استفاده از روش فوق و یا روشی که در بالای این پست بکار بردیم (همانند کد زیر) هیچ فرقی با هم ندارد و کاملا سلیقه ای می باشد.


بنابراین این شمایید که باید تصمیم بگیرید از کدام یک از 2 کد فوق استفاده نمایید ، در عمل خروجی و کارکرد هر دو کد فوق یکسان می باشد.
خوب ، دریافت داده از EntityFramwork تقریبا نکته دیگه ای نداره ...
امیدوارم از این پست آموزشی لذت برده باشید.
خوشحال میشم اگر نظر شما در مورد این پست رو بدونم...
یا حق

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


نمایش تاریخ شمسی در asp.net به کمک Extension Method

در گذشته نمایش تاریخ شمسی در asp.net یکی از چالش های بزرگ برنامه نویسان بود، اما امروزه با وجود متد های الحاقی (Extension Method) این کار به یکی از جالب ترین کارها تبدیل شده است.
قبل از پرداختن به کدها ابتدا باید با ماهیت Extension Method یا متدهای الحاقی آشنا شویم.

Extension Method یا متد الحاقی چیست ؟

متدهای الحاقی توابعی هستند که ما می توانیم از بیرون به یک کلاس اضافه نماییم.

بعنوان مثال کلاس زیر را در نظر بگیرید:




فرض کنید به کدهای داخل کلاس دسترسی نداریم (مثلا یک فایل DLL داریم که کلاس فوق درون آن است و به داخل آن دسترسی نداریم و یا در گذشته یک پروژه نوشته ایم که کلاس فوق در آن استفاده شده است و با تغییر در ساختار کلاس ممکن است مشکلی در پروژه بوجود آید و ...)

برای اینکه بتوانیم یک تابع (متد) به کلاس بالا اضافه نماییم ، داریم :


نکات مهم در متد الحاقی بالا public بودن و استاتیک بودن تابع و کلمه کلیدی this در ورودی تابع می باشد.

دقت نمایید که نام کلاسی که در ادامه کلمه کلیدی this در ورودی تابع می آید ، نشان می دهد که تابع به کدام کلاس الحاق می شود.

دقت نمایید که متدهای الحاقی باید درون یک کلاس با دسترسی public و از نوع static  قرار بگیرد.

جالبی کار در اینجاست که اگر ما یک نمونه (instance) از کلاس Person بسازیم ،به راحتی به متد الحاقی GetFullName دسترسی داریم !




ملاحظه می نمایید که به روش فوق با راحتی توانستیم یک متد را به کلاس Person الحاق نماییم.


نکته دیگر دستور بالا استفاده نکردن از کانستراکتور و بهره گیری از قابلیت جدید سی شارپ می باشد که در آن می توان بدون نیاز به نوشتن کانستراکتور و پاس دادن اطلاعات در آن ، پراپرتی ها را درون دو عدد براکت { } بصورت درجا مقدار دهی نمود.

توضیح اینکه در گذشته برای هر کلاس دو عدد کانستراکتور می نوشتیم که یکی کانستراکتور خالی و دیگری کانستراکتوری بود که به تعداد پراپرتی ها مقدار می گرفت و آنها را درون پراپرتی ها ست می نمود.
امروزه دیگر نیاز به نوشتن کانستراکتور دوم نیست و بصورت بالا می توان خیلی راحت پراپرتی ها را مقدار دهی نمود.

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

نمایش تاریخ شمسی در asp.net به کمک Extension Method

برای این کار فقط کافی است یک متد به کلاس DateTime دات نت اضافه  (الحاق) نماییم :


بنابراین دیگه نیاز نیست که نگران نمایش تاریخ شمسی توی پروژه هاتون باشین.

فقط کافیه که :


این مورد در زمان استفاده از  Entity Framework خیلی بکارتون میاد ، وقتی که می خوایم لیستی از اطلاعات رو به همراه تاریخ شمسی نمایش بدیم.

مثلا:


ملاحظه می کنید که با کمک Entity Framework  و  Extension Method به چه سادگی توانستیم اطلاعات اشخاص را به همراه تاریخ عضویت آنها (بصورت شمسی) توی پروژمون نمایش بدیم.

موفق باشید.

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


استفاده از تابع foreach در entity framework در پروژه های asp.net

چند روز پیش یک کد دیدم که توش خیلی جالب با دستور 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،     | نظرات()


بزرگترین سوتی برنامه نویسی Entity Framework برنامه نویسان وب

Entity framework یکی از بهترین ORM های برای ایجاد لایه BLL پروژه های asp.net است. امروزه روز تقریبا همه برنامه نویسان کدهای ADO.Net عهد عتیق رو فراموش کرده اند و همه با Entity framework کد می زنن.
با توجه به سنگین بودن گرید ویو امروزه روز دیگه هیچکس با گریدویو کار نمی کنه و برنامه نویسان حرفه ای با رپیتر کار می کنن، یکی از مشکلات رپیتر اینه که صفحه بندی نداره و خود برنامه نویس باید یک سیستم صفحه بندی براش بنویسه. خوب شاید با خودتون بگین که مگه دیوانه ایم ، گریدوبو به اون خوبی که خودش صفحه بندی هم داره رو بذاریم کنار و بعد بیایم با رپیتر و سایر کنترل های داده ای کار کنیم که صفحه بندی نداره ! و بعدشم کلی کد واسه صفحه بندی اطلاعاتمون بزنیم!
در جواب باید خدمتتون عرض کنم که فرض کنین که تیو یک جدول 1000 تا رکورد داریم (داده) ، حال می خواهیم با گرید ویو این 1000 رکورد رو بصورت صفحه بندی و در هر صفحه 10 رکورد رو نمایش بدیم ، در این حالت سیستم صفحه بندی گرید ویو بدین صورته که اول همه 1000 تا رکورد رو از دیتابیس باید بگیریم و به گریدویو بدیم؛
بعد گریدویو فقط 10تاشو تیو صفحه نمایش میده!
البته گرید ویو اطلاعات رو کش می کنه و هر دفعه نیاز نیست که با هر بار PostBack شدن صفحه ، اطلاعات رو مجدد از دیتابیس بگیریم و بهش بدیم، ولی با این حال هنوز مشکل دریافت 1000 رکورد از دیتابیس و تحویل اون به گرید ویو به قوت خودش باقی است.
حال فرض کنین که سایت شما روزی 10000 تا بازدید کننده داشته باشه، هر بازدید کننده مگر چند تا صفحه از مطالب شما رو می خونه ؟
آیا نیازه که واسه هر بازدید کننده 1000 تا رکورد از دیتبایس دریافت بشه ؟ در حالی که شاید نهایتا بازدید کننده 2-3 صفحه اول مطالب رو بخونه ؟
این مشکل باعث رد و بدن شدن حجم بالایی از اطلاعات بین وب سرور و SQL سرور میشه که زیاد حرفه ای به نظر نمیرسه!

بدین دلیل است که برنامه نویسان حرفه ای و اونایی که به بهینه بودن کدهاشون و سرعت سایت هاشون اهمیت میدن، روش استفاده از پروسیجر رو پیش گرفتند.
بدین صورت که شما یک پروسیجر می نویسین که 2 تا ورودی می گیره:
  1. شماره صفحه
  2. تعداد رکوردهایی که می خواین توی هر صفحه نمایش بدین

این پروسیجر کارش اینه که فقط به تعدادی که نیاز داریم رکورد از دیتابیس بگیره و تحویل رپیتر بده.

بدین صورت که اگر من بهش عدد 2 و 10 رو به ترتیب بدم، پروسیجر 10 تا رکورد دوم رو بهم میده (یعنی 10 تا رکورد اول رو بی خیال میشه و 10 تای بعدی رو به من میده) و اگر مقدار 5 و 10 رو بدم ، 10 تا رکورد پنجم رو بهم میده (یعنی 40 تا رکورد اول رو بی خیال میشه و 10 تای بعدیش رو به من میده)

بدین ترتیب شما همیشه فقط و فقط به مقدار اطلاعاتی که نیاز داریم از دیتابیس دیتا می گیرین.

شروع عرصه Entity framework :

با شروع همه گیر شدن Entity framework برنامه نویسان دیگه کم کم پروسیجر رو فراموش کردند و تقریبا همه کدهایی که یک زمانی باید براشون پروسیجر می نوشتیم و کلی کد سی شارپ هم براش می نوشتیم تا بتونیم از اون پروسیجر ها استفاده کنیم، خدا بیامرز شدن و همه اون همه کد با یک خط کد ساده بوسیله Entity framework انجام میشه

صفحه بندی اطلاعات در Entity framework با کمک دو دستور ()Skip و ()Take انجام میشه.

حال یکی از سوتی هایی برنامه نوییسان در حین کار با این دستورات میدن اینه که دستورات خودشونو بصورت زیر می نویسن:


کد سی شارپ بالا که با دستورات Lambda نوشته شده(1)  در دید اول ممکنه به نظر درست بیاد، در این کد من خبرهای دو تا مونده به آخری رو از دیتابیس دریافت کرده ام ؛ بدین صورت که ابتدا خبر ها رو از آخر به اول چینش کرده ام و سپس اولین خبر بالای لیست رو بی خیال شده ام (از روش پریده ام) و 2 خبر بعدیش رو دریافت کرده ام.

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

اگر دستور SQL ای که با اجرای کد بالا روی دیتابیس اجرا میشه رو با نرم افزار SQL Profiler مشاهده کنیم ، می بینیم که چنین کدی روی دیتابیس اجرا میشه:


ملاحظه می کنین که در اصل ما همه رکوردها رو داریم از دیتابیس می گیریم و بعد توس سمت سی شارپ (وب سرور) داریم 2 تاشو جدا می کنیم و این یعنی اینکه ما داریم سر خودمونو کلاه میزاریم و در اصل همه رکوردها داره از دیتابیس دریافت میشه که این اصلا بهینه نیست !

روش صحیح کد نویسی برای صفحه بندی ، بدین صورته:


با اجرای این کد ، دستور زیر بروی دیتابیس اجرا می شود:


ملاحظه می کنین که دقیقا 2 رکورد مورد نظر از دیتابیس دریافت شده است.
نکته مهمی که از این آزمایش می توان نتیجه گرفت این است که همیشه اول Skip  و Take رو بنویسین و بعد دستور ToList رو بنویسین.
این نکته ممکنه خیلی ساده به نظر بیاد ، ولی توی سرعت پروژتون خیلی تاثیر داره.
وقتی کدای یک پروژه رو بررسی می کردم به این نکته پی بردم، برای همین اینجا نوشتم که همه بهره ببرند.
موفق باشید.

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


nHibernate یا EntityFramework مسئله این است!

با سلام.
در پروژه های نرم افزاری ، کار با اطلاعات موجود در دیتابیس بخش اصلی پروژه رو تشکیل میده و حدود 30 تا 40 درصد زمان پروژه ها نیز صرف نوشتن کدهای این بخش می شود، حال آنکه بخش اعشم این کدها یک روال تکراری را دنبال می کنند (همانند نوشتن یک سری کلاس که دارای یک سری پراپرتی می باشند و نوشتن متدهای معروف   Select-Add-Update-Delete و ...)
حال آنکه یک ORM می تواند همه این کدهای زمان بر و خسته کننده را به راحتی و بصورت خیلی بهینه و تمیز برای شما بنویسند

nHibernate و Entityframework دو عدد ORM بسیار معروف هستند که اولی بصورت سورس باز می باشد و دومی متعلق به شرکت مایکزوسافت است.

nHibernamte بسیار قدیمی تر از  Entityframework است و چندین سال قبل از بوجود آمدن Entityframework بوجود آمده است و برنامه نویسان قدیمی اکثرا با این ORM کار می کردند و لایه های DataAccess خود را با آن می نوشتند ...

کار کردن با nHibernate نیاز به تجربه و علم بیشتری دارد و یکم سخت تر هم هست ولی کار با Entityframework بسیار راحت است ، بطوری که بچه 5 ساله هم می تونه باهاش کار کنه!

حال برخی به NH اعتقاد دارند و برخی به EF و همیشه سر این دو گروه جنگ و دعوای بسیار بوده است ...

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

باز اگر لینک خوبی پیدا کردم ؛ توی همین پست قرار میدم ....

دوستان توجه داشته باشند که من از خودم هیچی نگفتم ، چون با NH کار نکردم که بتونم نظر خودم رو بگم و دو لینکی که گذاشتم از دو شخص با تجربه است که هر دو با EF و NH کار کرده اند

یا حق

نوشته شده در تاریخ دوشنبه 21 بهمن 1392    | توسط: ح.م    | طبقه بندی: آموزش ASP.NET، آموزش Entity Framework،     | نظرات()


آموزش کامل انواع روش های واکشی اطلاعات در سی شارپ و asp.net - بخش سوم

در آموزش های قبلی برخی روش های دریافت اطلاعات از دیتابیس و نمایش اون در صفحات رو آموزش دادم.
امروز می خوام  روش های دیگر دریافت اطلاعات از دیتابیس (ado.net) رو آموزش بدم.

3- با استفاده از Entity Framework عزیز دلم

البته به زودی یک تالار مخصوص Entity Framework باز می کنم و بصورت کامل کامل این تکنولوژی عزیز و دوست داشتنیمو آموزش میدم.


در این روش ابتدا شما باید Add New Item بزنین و بعد یک فایل از نوع ADO.Net Entity Data Model به پروژتون اضافه می کنین و اون رو روی دیتابیستون تنظیم می کنین و Next میزنین تا آخر.
(اول کانشکن جهت اتصال به دیتابیس رو می گیره و بعد لیست تمامی جداول و پروسیجر های دیتبایستون رو میاره که همه رو تیک میزنین و تمام)

* دریافت یه عالمه دیتا (چندین سطر) از دیتابیس:

با فرض اینکه من مدلم رو با نام MyModel ساخته ام و entity خودمو هم با نام MyEntities ساخته ام، داریم:

ابتدا مدلم رو به صفحه ام اضافه می کنم:

سپس در رویداد لود داریم :

با توجه به حجم کم کدهای من ، فکر می کنم دلیل علاقه شدید بنده رو درک کرده باشید


* دریافت یک رکورد (یک سطر) از دیتابیس:

شایان ذکر است که کدهای Entity Framework رو به دو صورت میشه نوشت :

1- با دستورات LINQ
2- با دستورات Lambda


در بالا من به روش لامبدا نوشتم.
این روش هم کوتاه تره و هم باحال تره و هم اینکه وقتی شما با LINQ دستورات رو بنویسین ، در زمان اجرا این دستوران به زیان لامبدا تبدیل و سپس اجرا میشن ، پس اگر لامبدا کد بزنین هم جذاب تره و هم اینکه یک مرحله کار اجرا جلو می افته و مسلما سرعت اجرای دستوراتتون بالاتر میره.


* دریافت یه مقدار واحد از دیتابیس:

برای دریافت یک مقدار واحد 2 تا راه داریم که در بالا هر دو رو نوشته ام.

در روش اول من پروپرتی مورد نظر رو فقط از دیتابیس گرفته ام؛ این دستور موجب اجرای دستور SQL ای "SELECT Name FROM Members" رو دیتابیس میشه

در روش دوم من همه پروپرتی ها رو از دیتابیس گرفته ام و بعد فقط از Name اون استفاده کرده ام؛ این دستور موجب اجرای دستور SQL ای "SELECT * FROM Members" رو دیتابیس میشه

مسلما روش اول بهینه تره.

امیدوارم که از سری آموزش های روش های واکشی اطلاعات از دیتابیس من خوشتون اومده باشه
سری کامل مقالات آموزش ado.net رو می تونین از اینجا مشاهده نمایید.

نوشته شده در تاریخ شنبه 27 مهر 1392    | توسط: ح.م    | طبقه بندی: آموزش ado.net، آموزش Entity Framework، آموزش ASP.NET،     | نظرات()


آموزش کامل انواع روش های واکشی اطلاعات در سی شارپ و asp.net - بخش اول

چه در برنامه های تحت ویندوز و چه در برنامه های تحت وب ، برای واکشی اطلاعات از دیتابیس یک سری روش ها مشخص وجود دارد.

در مقالات قبلی کمی با ado.net آشنا شدیم ، امروز می خوام بصورت کامل و مفصل با انواع روش های دریافت اطلاعات از دیتابیس و نمایش اون درون سایت آشنا بشیم.


این روش ها عبارتند از:

  1. استفاده از کنترل SqlDataSource : این روش به دلیل اینکه خطاها رو اصلا نمیشه کنترل کرد ، فقط در پروژه های دانشجویی کاربرد داره.
  2. کد نویسی دستی (ADO.Net) : این روش خود به چند روش قابل انجامه:
    • SqlDataReader
    • SqlAdapter و DataTable
    • Scalar
  3. با کمک عزیز دل خودم یعنی Entity Framework
در ادامه مقاله شما را با تمامی این روش ها آشنا می کنم و کلی مثال براتون میزارم که کاملا با کدنویسی هر روش آشنا بشید.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

نوشته شده در تاریخ جمعه 14 تیر 1392    | توسط: ح.م    | طبقه بندی: آموزش ASP.NET، آموزش ado.net، آموزش Entity Framework،     | نظرات()


آموزش رفع ارور مهلک the ObjectContext instance has been disposed and can no longer be used for operations that require a connection در entity framework

آموزش رفع ارور مهلک the ObjectContext instance has been disposed and can no longer be used for operations that require a connection در entity framework


دوستانی که با تکنولوژی حرکن می کنن و الان دارن با Entity Framework کد میزنن ، خیلی از مواقع ممکنه که با همچین اروری برخورد کنن.

در توضیح باید خدمتتون عرض کنم که بنده 2 روزه دارم با این ارور سرو کله میزنم که طبق چیزی که بنده متوجه شدم ، این ارور موقعی رخ میده که شما یک کد linq روی entity framework تون نوشتین که در خروجیش لیستی از اشیاء رو دارین از دیتابیس دریافت می کنین.

حال اگر بخواهید روی خروجی یک تابعی مثل skip رو اجرا کنین ، از اونجایی که در entity framework تا وقتی که از متغیر خروجی دستورتون استفاده نکنین ، چیزی از دیتابیس دریافت نمیشه ، entity framework بیچاره نمی تونه روی یک متغیر null بیاد و تابعی مثل skip رو اجرا کنه و بنابراین ارور مهلک بالا رو بهتون نمایش میده.

به بیان ساده تر ، در  تا وقتی که خروجی دستور Linq تونو داخل یک کنترل داده ای نریزید و یا با forearch روی خروجی حرکت نکنین ، هیچ اتصالی به دیتابیس انجام نمی پذیره و مسلما از اونجایی که خروجی دستور linkq تون رو که داخل یک متغیر var ریختین ، متغیرتون کاملا خالیه (null).

حالا اینکه شما انتظار دارید که بیاد و روی هیچی (یک متغیر null) یک تابعی رو اجرا کنه ، یک خواست نادرستیه و entity framework درخواست نابجای شما رو با ارور مهلک the ObjectContext instance has been disposed and can no longer be used for operations that require a connection  پاسخ میده.

تا شما باشین درخواست نابجا نکنین :)
سایت نت نیک

رفع ارور مهلک the ObjectContext instance has been disposed and can no longer be used for operations that require a connection در entity framework:

رفع خطا بسیار ساده است ، در entity framework توابعی وجود دارد که موجب می شوند که بلافاصله پس از اجرای این توابع ، اتصال به دیتابیس صورت گیرد و اطلاعات مورد نظر از دیتابیس دریافت گردد.
دستور ()ToList یکی از این توابع است.

کافی است شما قبل از استفاد هاز توابعی مانند skip از این تابع استفاده نمایید تا بلافاصله اطلاعات از دیتابیس دریافت بشه و entity framework بتونه تابع مورد نظر شما رو روی خروجی دیتابیس اجرا کنه.

البته این چیزیه که من بهش رسیدم و ممکنه 100% کامل و درست نباشه ؛
ولی از اونجایی که در این سایت من دارم تجربیات و مطالبی که خودم در حین برنامه نویسی می فهمم رو آموزش میدم ، این امر کاملا طبیعی است که برخی مطالب کامل نباشند.
خوب مشکل من که با این روش حل شد :)
خوب به همین سادگی ، تا آموزشی دگر بدرود

نوشته شده در تاریخ پنجشنبه 23 خرداد 1392    | توسط: ح.م    | طبقه بندی: آموزش ASP.NET، آموزش Entity Framework،     | نظرات()