۳۰ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

نحوه استفاده از ویژگی های پیشرفته Dapper در ASP.NET Core

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

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

Dapper ORM (نقشه‌نگار رابطه‌ای شی) به دلیل سرعت و سادگی بالا، برای کار با پایگاه‌های داده در دات‌نت محبوبیت گسترده‌ای پیدا کرده است. ما اصول کار با Dapper را در مقاله قبلی در اینجا آموختیم. همچنین کار با کتابخانه Dapper Extensions را در مقاله قبلی مورد بحث قرار دادیم. در این مقاله، نگاهی به برخی از ویژگی‌های پیشرفته Dapper خواهیم انداخت.

برای استفاده از نمونه کدهای ارائه شده در این مقاله، باید Visual Studio 2022 را در سیستم خود نصب کنید. اگر قبلاً نسخه‌ای ندارید، می‌توانید Visual Studio 2022 را از اینجا بارگیری کنید.

یک پروژه ASP.NET Core Web API در Visual Studio 2022 ایجاد کنید

ابتدا، اجازه دهید یک پروژه ASP.NET Core 7 در Visual Studio 2022 ایجاد کنیم. این مراحل را دنبال کنید:

  1. Visual Studio 2022 IDE را راه اندازی کنید.
  2. روی “ایجاد پروژه جدید” کلیک کنید.
  3. در پنجره “ایجاد پروژه جدید”، “ASP.NET Core Web API” را از لیست الگوهای نمایش داده شده انتخاب کنید.
  4. بعدی را کلیک کنید.
  5. در پنجره “پیکربندی پروژه جدید خود”، نام و مکان پروژه جدید را مشخص کنید.
  6. به صورت اختیاری، بسته به تنظیمات برگزیده خود، کادر انتخاب «قرار دادن راه حل و پروژه در یک فهرست راهنمای» را علامت بزنید.
  7. بعدی را کلیک کنید.
  8. در پنجره «اطلاعات اضافی» که در ادامه نشان داده شده است، کادر «استفاده از کنترل‌کننده‌ها (برای استفاده از حداقل API‌ها علامت آن را بردارید» را علامت بزنید. ما در این پروژه از حداقل API استفاده نخواهیم کرد. تنظیم «نوع احراز هویت» را روی «هیچ» (پیش‌فرض) بگذارید.
  9. مطمئن شوید که چک باکس‌های «فعال کردن پشتیبانی از API باز»، «پیکربندی برای HTTPS» و «فعال کردن داکر» بدون علامت باقی می‌مانند. ما از این ویژگی‌ها در اینجا استفاده نخواهیم کرد.
  10. روی ایجاد کلیک کنید.

ما از این پروژه ASP.NET Core 7 Web API برای کار با ویژگی‌های پیشرفته Dapper در بخش‌های زیر استفاده خواهیم کرد.

Dapper چیست؟ چرا از آن استفاده کنید؟

نقشه‌نگارهای شی رابطه‌ای سال‌هاست که برای رسیدگی به «عدم تطابق امپدانس» بین مدل‌های شی در زبان‌های برنامه‌نویسی و مدل‌های داده در پایگاه‌های داده رابطه‌ای استفاده می‌شوند. تیم Stack Overflow Dapper را ایجاد کرد تا یک ORM ساده برای دات نت باشد. Dapper یک پروژه منبع باز در GitHub است.

Microsoft.NET 8 Blazor و WebAssembly را تقویت می کند

Dapper یک چارچوب micro-ORM سبک وزن، با کارایی بالا برای .NET و .NET Core است که از طیف گسترده ای از پایگاه های داده پشتیبانی می کند. اینها عبارتند از Microsoft SQL Server، Oracle Database، MySQL، PostgreSQL، SQLite و SQL CE. در مقایسه با سایر ORMها، Dapper سبک، سریع و ساده است و با در نظر گرفتن عملکرد و قابلیت استفاده طراحی شده است.

ویژگی های پیشرفته در Dapper

در این بخش، برخی از ویژگی‌های پیشرفته Dapper را با مثال‌های کد مرتبط بررسی می‌کنیم.

چند نقشه برداری

قابلیت نقشه برداری چندگانه Dapper به شما امکان می دهد نتایج پرس و جو را به چندین شی نگاشت کنید. از این نوع پرس و جو می توان برای به دست آوردن داده های مرتبط از جداول متعدد با یک پرس و جو استفاده کرد. با ارسال یک تابع delegate به عنوان آرگومان به متد Query یا روش QueryAsync، می توانید به Dapper دستور دهید تا نتایج یک پرس و جو را به اشیاء مختلف نگاشت کند. دو کلاس زیر را در نظر بگیرید.

public class Author
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
public class Book
{
    public int Id { get; set; }
    public int AuthorId { get; set; }
    public string Title { get; set; }
    public string ISBN { get; set; }
}

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

string connectionString = "Specify the connection string to connect to your database...";
using (var connection = new SqlConnection(connectionString))
{
    string query = "SELECT * from Authors A Inner Join Books B ON A.Id = B.AuthorId";
    var authors = connection.Query<Author, Book, Author>(
                query,
                (author, book) =>
                {
                    author.Books = author.Books ?? new List<Book>();
                    author.Books.Add(book);
                },
            splitOn: "Id"
        ).Distinct().ToList();
}

پشتیبانی گسترده پایگاه داده

Dapper برای اتصال و کار با چندین نوع پایگاه داده مانند SQL Server، Oracle Database، MySQL و PostgreSQL پشتیبانی می کند. قطعه کد زیر نشان می دهد که چگونه می توانید با استفاده از Dapper به این پایگاه داده های مختلف متصل شوید.

var connection = new SqlConnection(connectionString); //Connecting to SQL Server database
var connection = new OracleConnection(connectionString); //Connecting to Oracle database
var connection = new MySqlConnection(connectionString); //Connecting to MySQL database
var connection = new NpgsqlConnection(connectionString); //Connecting to PostgreSQL database

درج انبوه

Dapper عملیات درج انبوه را ارائه می دهد که می تواند عملکرد را به میزان قابل توجهی افزایش دهد، زمانی که می خواهید حجم زیادی از داده را در پایگاه داده خود وارد کنید. کلاس SqlBulkCopy در ADO.NET امکان انتقال کارآمد داده بین منبع و پایگاه داده را فراهم می کند. در Dapper، می‌توانید با ارسال مجموعه‌ای از اشیاء به SqlMapperExtensions.Insert، درج‌های انبوه را انجام دهید.

جنکینز چیست؟ سرور CI توضیح داد

نمونه کد زیر نشان می‌دهد که چگونه می‌توانید درج‌های انبوه را با استفاده از Dapper در برنامه ASP.NET Core 7 خود انجام دهید.

using (var connection = new SqlConnection(connectionString))
{
    connection.Open();
    var orders = GetOrders();
    var transaction = connection.BeginTransaction();
    try
    {
        connection.Execute("INSERT INTO Orders (Id, ProductId, Amount)
        Values (@Id, @ProductId, @Amount)", orders);
        transaction.Commit();
    }
    catch
    {
        transaction.Rollback();
        throw;
    }
  return;
}

روش های ذخیره شده

شما می توانید از Query، QueryFirstOrDefault، Execute و روش های مشابه برای فراخوانی رویه های ذخیره شده در Dapper استفاده کنید. Dapper همچنین از تعامل با پارامترهای خروجی و مقادیر بازگشتی رویه های ذخیره شده از طریق کلاس DynamicParameters پشتیبانی می کند که نحوه کار با پارامترها را ساده می کند.

نمونه کد ارائه شده در زیر نشان می دهد که چگونه می توانید با رویه های ذخیره شده با استفاده از Dapper در برنامه ASP.NET Core 7 خود کار کنید.

using (var connection = new SqlConnection(connectionString))
{
    var parameters = new DynamicParameters();
    int customerId = 27;
    string orderStatus = "Pending";
    parameters.Add("@CustomerId", customerId, DbType.Int32);
    parameters.Add("@OrderStatus", orderStatus, DbType.String);
    var orders = connection.Query<Order>("GetOrdersByStatus", parameters,
        commandType: CommandType.StoredProcedure);
    // Write your code here to process the retrieved orders
    return orders.ToList();
}

صفحه بندی پرس و جو

هنگامی که با مجموعه نتایج بزرگ سروکار دارید، صفحه بندی برای بهبود عملکرد و کارایی بسیار مهم است. از متدهای Skip و Take در Dapper می توان برای انجام صفحه بندی پرس و جو استفاده کرد. با ترکیب این روش‌ها با عبارت‌های SQL OFFSET و FETCH NEXT، می‌توانید به طور موثر زیرمجموعه‌ای از داده‌ها را از پایگاه داده بازیابی کنید.

در زیر یک نمونه کد وجود دارد که نحوه استفاده از صفحه بندی پرس و جو را در Dapper نشان می دهد.

string connectionString = "Specify the connection string to connect to your database...";
using (var connection = new SqlConnection(connectionString))
{
    var pageNumber = 1;
    var pageSize = 10;
    var offset = (pageNumber - 1) * pageSize;
    var query = @"
        SELECT *
        FROM Orders
        ORDER BY OrderId
        OFFSET @Offset ROWS
        FETCH NEXT @PageSize ROWS ONLY";
    var parameters = new
    {
        Offset = offset,
        PageSize = pageSize
    };
    return connection.Query<Order>(query, parameters).ToList();
}

جنگ پرس و جو

این یک ویژگی عالی در Dapper است که عملکرد را به طور قابل توجهی بهبود می بخشد، به خصوص اگر پرس و جوها اغلب اجرا شوند. می توانید پرس و جوها و نتایج را در Dapper ذخیره کنید. هنگامی که پرس و جو را برای اولین بار اجرا می کنید، نتایج پس از اجرای پرس و جو در حافظه پنهان ذخیره می شود. هر زمان که همان پرس و جو دوباره اجرا شود و داده ها در حافظه پنهان موجود باشد، به جای بازیابی داده ها از یک فراخوانی API یا پایگاه داده، داده های ذخیره شده در حافظه پنهان بازگردانده می شوند.

علاقه به React، Angular و Vue در حال کاهش است

نمونه کد زیر نشان می‌دهد که چگونه می‌توان از حافظه پنهان کوئری استفاده کرد.

var sql = "SELECT * FROM Authors WHERE AuthorId = @AuthorId";
var author = connection.QueryFirstOrDefault<Author>(sql, new { AuthorId = authorId });
// When the query is executed the next time, it will use the cached result
var cachedAuthor = connection.QueryFirstOrDefault<Author>(sql, new { AuthorId = authorId });

پارامترهای پویا

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

using (var connection = new SqlConnection(connectionString))
{
    var parameters = new { CustomerId = 1, OrderStatus = "Shipped" };
    var query = "Select * From Orders Where CustomerId = @CustomerId AND Status = @OrderStatus";
    var orders = connection.Query<Order>(query, parameters).ToList();
    // Write your code here to process the retrieved orders
    return orders.ToList();
}

Dapper یک ORM سبک و قابل تنظیم است که بر عملکرد و سادگی تمرکز دارد. ویژگی‌های پیچیده Dapper می‌تواند قابلیت‌های دسترسی به داده‌ها را به میزان قابل توجهی بهبود بخشد و توسعه‌دهندگان را قادر می‌سازد تا تعامل مؤثرتری با پایگاه‌های داده در برنامه‌های ASP.NET Core داشته باشند.

اگرچه Dapper دارای عملکرد نسبتاً غنی است، اما همه ویژگی های ORM های قدرتمندتر مانند Entity Framework را ارائه نمی دهد. بنابراین، تجزیه و تحلیل الزامات برنامه و انتخاب فناوری دسترسی مناسب به داده ضروری است.