ابزار Dapper و دسترسی شی گرا به بانک اطلاعاتی

پرووید

دسته های مقالات

در این پست از وبسایت پرووید در رابطه با آموزش Dapper و دسترسی شی گرا به بانک اطلاعاتی
صحبت خواهیم کرد.

همه ما می دانیم که استفاده کردن از Entity Framework در کنار LINQ
بسیار جذاب است اما این موضوع هزینه هایی را هم نیز دارد. برای مثال استفاده کردن از LINQ در کنار Entity Framework در
مقایسه با استفاده کردن از ADO.NET و کلاس SQLDataAdapter از لحاظ زمانی سرباری را به برنامه متحمل می کند. این سربار
بسیار کم است اما صفر نیست.

اگر در شرایطی هستید که سرعت برای شما بسیار مهم است از Dapper به
جای Entity Framework استفاده کنید. Dapper نیز شبیه Entity Framework یک Object Relational Mapper می باشد اما تفاوت
بسیار جالبی با Entity Framework دارد. این تفاوت این است که سرعت دسترسی به داده ها با استفاده از Dapper با ADO.NET
برابر است.

به همین دلیل با استفاده از Dapper نه تنها می توانید به صورت شی
گرا به داده های بانک های اطلاعاتی خود دسترسی پیدا کنید بلکه می‌توانید از سرعت بسیار بالای آن استفاده کنید.

در ادامه این آموزش از وب سایت پرووید شما نحوه استفاده کردن از
Dapper را فرا خواهید گرفت.

Dapper چیست؟

در واقع Dapper به ‌عنوان یک Micro ORM شناخته می شود چرا که قابلیت های
بسیار کمتری نسبت به Entity Framework دارد. اما با توجه به اینکه داده های بانک های اطلاعاتی رابطه ای را در قالب
Entity ها بازیابی می کند هنوز هم یک ORM است. با توجه به این موضوع که Dapper قرار است یک ORM سبک وزن باشد در استفاده
از آن نیازی به ساختن کلاس Context شبیه به اتفاقی که در Entity Framework می‌افتد نیستیم. موضوع دیگر اینکه Dapper فقط
از دستورات خام SQL برای گرفتن Query ها و آپدیت کردن داده ها استفاده می کند و امکان ساخت کلاس هایی که با جداول بانک
های اطلاعاتی نگاشت بشوند وجود ندارد. علاوه بر این Dapper از روش Code First پشتیبانی نمی کند.

در واقع Dapper در قالب تعدادی Extension Method برای کلاس های Connection در
ADO.NET پیاده‌سازی شده است. هرچند که قابلیت های Dapper به اندازه قابلیت های Entity Framework نیست اما اکستنشن های
متعددی برای توسعه آن ساخته شده است. بعضی از این اکستنشن ها امکان انجام آپدیت به طور شی گرا و یا نگاشت کلاس ها به
جداول بانک های اطلاعاتی را فراهم می کند.

زیبایی استفاده از Dapper در این است که شبیه به کتابخانه های جاوا اسکریپت
شما فقط نیازمند به اضافه کردن کتابخانه هایی هستید که به آنها نیاز دارید. عیب این روش این است که شما نیاز به راه
اندازی Dapper با اضافه کردن و استفاده از اکستنشن های کوچکتر دارید که این خود می‌تواند اثر منفی بر روی Performance
داشته باشد.

استفاده از Dapper نیازمند به کدنویسی بیشتری نسبت به استفاده از Entity
Framework و LINQ است. البته این موضوع را نباید فراموش کرد که در ابتدای کار برای ساخت کلاس Context در Entity
Framework نیازمند کدنویسی بیشتری هستیم. موضوع دیگر اینکه در استفاده از Dapper در مقایسه با ADO.NET به کدنویسی کمتری
نیاز داریم.

کار کردن با Dapper

ساده ترین روش استفاده از Dapper پاس دادن یک دستور SQL یا نام
یک Stored Procedure به متد Query که یک Extension Method است می باشد. این متد به هر کلاسی که اینترفیس
IDBConnection را پیاده سازی کرده باشد افزوده می شود. بنابراین می توانیم از این متد در کلاس‌های Connection ی که
در ADO.NET وجود دارند استفاده کنیم. موضوع دیگر اینکه متد Query یک متد جنریک میباشد بنابراین باید به عنوان Type
Parameter نام Type ی که فیلدهای بانک اطلاعاتی به آنها نگاشت خواهد شد را مشخص کنید. در مثالی که در ادامه می‌بینید
متد Query برای خواندن سطرهایی از جدول Employees و ساختن یک کالکشن از اشیای کلاس Employee استفاده شده است.

 
Dim emps As List(Of Employee)
Using con = New SqlConnection(strConnection)
 emps = con.Query(Of Employee)("Select * from Employee")
 For Each emp As EmployeeBases In emps
 MessageBox.Show(emp.Name)
 Next
End Using

به منظور استفاده از پارامترها در دستورات SQL از علامت @
استفاده می کنیم. برای انجام این کار مقداری که میخواهید در پارامتر قرار بگیرد را در قالب Anonymous Type یا همان
نوع بدون نام در دستور مربوط به متد Query قرار دهید. دقت کنید که این Anonymous Type باید دارای پروپرتی هایی باشد
که نام آنها با نام پارامترهای دستور SQL شما یکسان است. علاوه بر این مقدار مورد نظر هر کدام از این پروپرتی ها را
هم تنظیم میکنید. در کدی که در قسمت پایین میبینید انجام یک دستور SQL با استفاده از تنظیم کردن یک پارامتر نشان
داده شده است.

 
emps = con.Query(Of Employee)("Select * from Employees Where Name Like ' percent'+ @Name", 
 New With {.Name = "Vogel"})

اگر قصد ارسال چندین دستور SQL را به طور همزمان دارید می
توانید از متود QueryMultiple استفاده کنید. برخی دیگر از قابلیت های Dapper و متد Query پاس دادن یک لیست از اشیا
است. کاربرد این تکنیک زمانی که می خواهید با عملوند In در SQL کار کنید اهمیت می یابد. به منظور استفاده مجدد از
پارامترها از یک کلاس کالکشنی که از نوع دیکشنری است و با نام DynamicParameters در Dapper وجود دارد استفاده کنید.
علاوه بر این کلاس DbString در Dapper کنترل بیشتری را به شما بر روی کار با رشته ها می دهد.

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

 
Dim emp As Employee
emp = con.QueryFirst(Of Employee)("Select * from Employees Where Id = @Id, 
 New With {.Id = 431})

متد های دیگری نیز از قبیل QuerySingle و QueryFirstOrDefault
و QuerySingleOrDefault برای به دست آوردن یک تک شی پیاده سازی شده اند. ضمنا به منظور ارسال دستورات Update و
Insert و Delete از متد Execute در Dapper استفاده می کنیم.

قابلیت Navigation Property در Dapper وجود ندارد بنابراین اگر
میخواهید داده های خود را از چندین جدول بخوانید نیازمند نوشتن دستورات JOIN در SQL هستید. به منظور نگاشت کردن
نتیجه چنین دستوری که از چندین جدول در بانک اطلاعاتی برای ساختن نتایج استفاده می‌کنند از یک Lambda Expression در
متد Query استفاده می کنیم. با استفاده از این Lambda Expression میتوانیم تنظیم کنیم که کدام یک از فیلد های موجود
در نتایج متد Query به کدام یک از فیلد های کلاس ها نگاشت شوند. ممکن است در چنین شرایطی دستورات SQL ی که با
استفاده از متد Query به سمت بانک اطلاعاتی ارسال میکنید ظاهر گیج‌کننده ای پیدا کنند که این خود از نقاط ضعف Dapper
است.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *