"> نوشتن Query با Dapper - بخش دوم | آموزش NET Core. | ام اس پی سافت

نوشتن Query با Dapper – بخش دوم

Query با Dapper

در بخش دوم آموزش استفاده از Dapper با شما هستم ،در این مقاله میریم سراغ نوشتن Query با Dapper که چطور میتونیم با این ORM ؛ Query های با کیفیت بنویسیم.

میتوانید بخش قبلی مقاله را در لینک‏ زیر مشاهده کنید.

نصب Dapper

Dapper یک nuget package است که چیزی جز augment ” تقویت” object موجود SQLConnection  در هسته NET ندارد.

…. به زبان ساده می توانید بسته بندی Dapper nuget را با اجرای موارد زیر از Console Package Manager خود نصب کنید.

Install-Package Dapper

در مثالهای زیر آنها را فقط از یک برنامه کنسول ساده اجرا می کنم ، اما می توانید Dapper را در هر نوع برنامه NET Full Framework / .NET Core نصب کنید.

همواره Data را دنبال کنید

برای آموزش بیشتر، می خواهم از داده هایی استفاده کنم که برای یک databaseساده “Event” ایجاد کردم.

واقعاً چیز زیادی وجود ندارد ، اما اگر می خواهید در میان Home دنبال آن باشید، می توانید اسکریپت را بگیرید تا پایگاه داده / جداول / داده ها را از این Github Gist ایجاد کنید:

vs2.ir/n3BNr

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

ایجاد یک اتصال database

همانطور که قبلاً دیده اید ، هنگام استفاده از Dapper باید SQL Connection خود را به database متصل کنید.

Dapper این کار را برای ما انجام نمی دهد. اما .. ساده اش میکند به عنوان مثال در برنامه کنسولی که من قبلاً Dapper را از Nuget در آن نصب کرده ام ، تمام نیازهای شما در این خلاصه میشود:

static void Main(string[] args)
{
    var connectionString = "Data Source=(local);Initial Catalog=DapperExample;Integrated Security=SSPI";

    using (SqlConnection connection  = new SqlConnection(connectionString))
    {
        //Do some magic here
    }
}

خودشه! اکنون ما با databaseخود ارتباط داریم که توسط “Dapper” آماده شده است.

متوجه خواهید شد که در این مرحله ، تنها عبارت “Using” که استفاده کرده ایم در System.Data.SqlClient است.

به این دلیل است که هدف یک SqlConnection منظم از NET library, است در حالی که حتی از Dapper استفاده نکرده ایم!

پرس و جو یک ردیف 

بگذارید جادویی اضافه کنیم در واقع اتصال SQL فوق را برای انجام کاری استفاده کنیم.

در database مثال خود ، من یک جدول به نام Event “رویداد” دارم که لیستی از وقایع در آن وجود دارد.

من می خواهم بدانم که نام این رویداد با شناسه ۱ چیست.

using (SqlConnection connection  = new SqlConnection(connectionString))
{
    var eventName = connection.QueryFirst<string>("SELECT TOP 1 EventName FROM Event WHERE Id = 1");
    Console.WriteLine(eventName);
    Console.ReadLine();
}

مطمئناً می توانیم SQL اولیه خود را در چیزی مانند SQL Management Studio بنویسیم و سپس آنرا کپی کنیم.

ما کنترل کاملی بر پرس و جو داریم و دقیقاً * آنچه را که ما به آن گفتیم اجرا خواهد شد.

بخش جادویی واقعی این روش ” QueryFirst ” است که در ارتباط با ما است.

اگر به سراغ کد منبع Dapper برویم ، می توانیم ببینیم که این تنها یک روش گسترش در object SqlConnection است.

public static T QueryFirst<T>(this IDbConnection cnn, CommandDefinition command);

این بخشی از زیبایی های کار با Dapper است.

استفاده از مفاهیم ساده در آن مانند SqlConnection که ما از قبل با آن ها آشنا هستیم، استفاده از آن را کارآمد تر میکند.

جدول پرس و جو در یک (object (Query A Table Into An Object

ابتدا یک کلاس ایجاد می کنیم که به SQL Tabl ما maps نقشه می دهد

class Event
{
    public int Id { get; set; }
    public int EventLocationId { get; set; }
    public string EventName { get; set; }
    public DateTime EventDate { get; set; }
}

سپس دستور(statement) خود را کمی تغییر می دهیم تا در عوض SELECT * باشد و در عوض از نوع بازگشت Event به جای رشته استفاده کنیم.

بنابراین به نظر می رسد مانند:

using (SqlConnection connection  = new SqlConnection(connectionString))
{
    var myEvent = connection.QueryFirst<Event>("SELECT * FROM Event WHERE Id = 1");
    Console.WriteLine(myEvent.Id + " : " + myEvent.EventName);
    Console.ReadLine();
}

اگر قبلاً از جمله های ADO خام استفاده کرده اید در NET ، می دانید که نقشه برداری دستی هر ملک از database تا کلاس سی شارپ مشکل می باشد .

اما Dapperاین کار را برای ما انجام می دهد.

نتیجه را از statement می گیرد و بررسی می کند که آیا ملکی (property) با همین نام در یک ستون وجود دارد یا نه، در صورت وجود ، نقشه عالی آن را خواهید دید! اگر نه ، نگران نباشید ، همین حالا آن را دور بیندازید.

Query Statement Into A DTO

بنابراین مثال بالا یک جدول کامل از database را به کلاس سی شارپ  نقشه برداری می کند ، اما بخش آزار دهنده این است که شاید ما به همه قسمت ها احتیاج نداریم. در مثال فوق ما در واقع فقط از قسمت های Id و EventName استفاده می کنیم ، بنابراین اجازه دهید ابتدا فقط DTO را با آن قسمتها ایجاد کنیم.

class EventDto
{
    public int Id { get; set; }
    public string EventName { get; set; }
}

سپس می توانیم درخواست خود را کمی تغییر دهیم تا فقط ستون های مورد نیاز خود را انتخاب کنیم ، و Dapper آن را به DTO خود تبدیل کنیم:

using (SqlConnection connection  = new SqlConnection(connectionString))
{
    var myEvent = connection.QueryFirst<EventDto>("SELECT Id, EventName FROM Event WHERE Id = 1");
    Console.WriteLine(myEvent.Id + " : " +myEvent.EventName);
    Console.ReadLine();
}

Using Parameterized Queries

ما واقعاً در این مرحله از user input استفاده نکردیم.

اما اجازه دهید به جای اینکه همیشه با (ID 1 ( Event را بدست آوریم ، تظاهر کنیم ، به کاربر اجازه دادیم IDرا مشخص کند.

چگونه می توانیم در حالی که میخواهیم بهترین عملکرد و تمرین را داشته باشیم، به درخواست Dapper پاسخ دهیم (aka parameterizing the query).

باز هم ، Dapper در این مسئله به ما کمک می کند:

using (SqlConnection connection  = new SqlConnection(connectionString))
{
    int eventId = 1;
    var myEvent = connection.QueryFirst<EventDto>("SELECT Id, EventName FROM Event WHERE Id = @Id", new { Id =  eventId});
    Console.WriteLine(myEvent.Id + " : " +myEvent.EventName);
    Console.ReadLine();
}

وانمود کنید که eventId در واقع از یک پارامتر GET یا هر user input دیگری آمده است.

تمام آنچه ما انجام می دهیم این است که یک عبارت @VariableName را در عبارت SQL جایگزین کنیم ، سپس یک پارامتر جدید از یک objectناشناس اضافه می کنیم که در آن “Key” برابر باVariableName است و مقدار آن چیزی که شما می خواهید باشد.

اما چرا نمی توانیم فقط line را به صورت زیر تغییر دهیم؟

exec sp_executesql N'SELECT Id, EventName FROM Event WHERE Id = @Id',N'@Id int',@Id=1

هر دو به نظر می رسد که جایگزینی (substitutions) انجام می دهند ، اما اولی در واقع از اجرای پارامترهای مناسب هنگام اجرای جمله SQL استفاده می کند. اگر از SQL Profiler استفاده می کنید ، اول (query) زیر را مشاهده خواهید کرد:

var myEvent = connection.QueryFirst<EventDto>($"SELECT Id, EventName FROM Event WHERE Id = {eventId}");

توجه کنید که پارامتر پس از پرس و جو (query) مشخص شده است ، و برای مثال دوم که فقط از جایگزینی رشته (string) استفاده می کنیم:

SELECT Id, EventName FROM Event WHERE Id = 1

اوه اوه ، هیچ پارامتری در اینجا نیست.

این دست ما را برای SQL Injection مقدار زیادی باز می کند. اما باز هم، Dapper با پارامترهای مناسب این کار را برای ما انجام می دهد!

Query Multiple Rows

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

using (SqlConnection connection = new SqlConnection(connectionString))
{
    var allEvents = connection.Query<EventDto>("SELECT Id, EventName FROM Event");
    foreach (var myEvent in allEvents)
    {
        Console.WriteLine(myEvent.Id + " : " + myEvent.EventName);
    }
    Console.ReadLine();
}

ما فقط “QueryFirst” خود را به “Query” تغییر می دهیم و دور می شویم! در عوض لیستی از object نقشه برداری شده که می توانیم از طریق آن چرخش کنیم ، بسیار آسان است!

  • پسورد: www.mspsoft.com
برچسب‌ها:
زهره سلطانیان

نوشته‌های مرتبط

دیدگاه‌ها

*
*

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

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