Trang Designer – Thiết kế website – Mua bán theme giá rẻ, plugin giá rẻ – Dịch vụ thiết kế website giá rẻ chuyên nghiệp chuẩn SEO – Mua bán theme giá rẻ, plugin giá rẻ chính hãng 100% từ nhà cung cấp, hỗ trợ update trọn đời

Linq2Db là một micro ORM (Object Relational Mapper) mã nguồn mở cho .NET, giúp bạn truy vấn và thao tác với cơ sở dữ liệu một cách hiệu quả thông qua cú pháp LINQ. Linq2Db có thiết kế nhẹ, hiệu năng cao và hỗ trợ nhiều hệ quản trị cơ sở dữ liệu (như SQL Server, MySQL, PostgreSQL, Oracle, SQLite, …). Nó không có cơ chế change tracking phức tạp như Entity Framework mà thay vào đó hướng đến việc thực thi các truy vấn LINQ một cách trực tiếp và tối ưu.
Tìm hiểu về Linq2Db và sử dụng trong ASP.NET Core Web API
Tìm hiểu về Linq2Db và sử dụng trong ASP.NET Core Web API

Tìm hiểu về Linq2Db

Linq2Db là một micro ORM (Object Relational Mapper) mã nguồn mở cho .NET, giúp bạn truy vấn và thao tác với cơ sở dữ liệu một cách hiệu quả thông qua cú pháp LINQ. Linq2Db có thiết kế nhẹ, hiệu năng cao và hỗ trợ nhiều hệ quản trị cơ sở dữ liệu (như SQL Server, MySQL, PostgreSQL, Oracle, SQLite, …). Nó không có cơ chế change tracking phức tạp như Entity Framework mà thay vào đó hướng đến việc thực thi các truy vấn LINQ một cách trực tiếp và tối ưu.

Dưới đây là hướng dẫn cơ bản tích hợp Linq2Db vào một dự án ASP.NET Core Web API.

Cài đặt Linq2Db

Bạn cần cài đặt package Linq2Db và package hỗ trợ cho loại CSDL bạn sử dụng (ví dụ: SQL Server):

dotnet add package linq2db
dotnet add package linq2db.SqlServer

Cấu hình chuỗi kết nối

Trong file appsettings.json, thêm chuỗi kết nối đến cơ sở dữ liệu của bạn:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;"
  }
}

Định nghĩa Entity (Model) với Linq2Db

Sử dụng các attribute của Linq2Db để ánh xạ đối tượng với bảng trong CSDL. Ví dụ, với bảng Products:

using LinqToDB.Mapping;

[Table(Name = "Products")]
public class Product
{
    [PrimaryKey, Identity]
    public int Id { get; set; }
    
    [Column, NotNull]
    public string Name { get; set; }
    
    [Column, NotNull]
    public decimal Price { get; set; }
}

Tạo DataConnection (Context)

Tạo lớp kế thừa từ LinqToDB.Data.DataConnection để định nghĩa kết nối và các bảng dữ liệu:

using LinqToDB;
using LinqToDB.Data;

public class MyDatabase : DataConnection
{
    public MyDatabase(string connectionString)
        : base(ProviderName.SqlServer, connectionString) // Sử dụng provider phù hợp, ví dụ: ProviderName.SqlServer
    {
    }

    // Định nghĩa bảng Products
    public ITable<Product> Products => GetTable<Product>();
}

Tích hợp Linq2Db vào ASP.NET Core qua Dependency Injection

Trong file Program.cs (với .NET 6 trở lên), cấu hình DI để đăng ký MyDatabase:

using LinqToDB;
using LinqToDB.Data;

var builder = WebApplication.CreateBuilder(args);

// Lấy chuỗi kết nối từ appsettings.json
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");

// Đăng ký MyDatabase với vòng đời Scoped (một phiên làm việc cho mỗi request)
builder.Services.AddScoped<MyDatabase>(provider =>
{
    return new MyDatabase(connectionString);
});

builder.Services.AddControllers();

var app = builder.Build();

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

Tạo API Controller sử dụng Linq2Db

Tạo controller để cung cấp các endpoint CRUD cho entity Product. Ví dụ:

using Microsoft.AspNetCore.Mvc;
using System.Linq;

[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase
{
    private readonly MyDatabase _db;

    public ProductsController(MyDatabase db)
    {
        _db = db;
    }

    // GET: api/Products
    [HttpGet]
    public IActionResult GetProducts()
    {
        var products = _db.Products.ToList();
        return Ok(products);
    }

    // GET: api/Products/5
    [HttpGet("{id}")]
    public IActionResult GetProduct(int id)
    {
        var product = _db.Products.FirstOrDefault(p => p.Id == id);
        if (product == null)
            return NotFound();
        return Ok(product);
    }

    // POST: api/Products
    [HttpPost]
    public IActionResult PostProduct([FromBody] Product product)
    {
        // Chèn sản phẩm mới và lấy ID tự động sinh ra
        var insertedId = _db.InsertWithInt32Identity(product);
        product.Id = insertedId;
        return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, product);
    }

    // PUT: api/Products/5
    [HttpPut("{id}")]
    public IActionResult PutProduct(int id, [FromBody] Product product)
    {
        if (id != product.Id)
            return BadRequest();

        // Cập nhật sản phẩm (lưu ý: Linq2Db không có cơ chế change tracking tự động)
        var rowsAffected = _db.Update(product);
        if (rowsAffected == 0)
            return NotFound();

        return NoContent();
    }

    // DELETE: api/Products/5
    [HttpDelete("{id}")]
    public IActionResult DeleteProduct(int id)
    {
        var rowsAffected = _db.Products.Delete(p => p.Id == id);
        if (rowsAffected == 0)
            return NotFound();
        return NoContent();
    }
}

Lưu ý:

  • Linq2Db không thực hiện change tracking như các ORM toàn diện khác. Bạn cần gọi các phương thức như InsertWithInt32Identity, Update, hoặc Delete để thực hiện thao tác dữ liệu.
  • Các truy vấn được viết dưới dạng LINQ giúp code trở nên trực quan và dễ bảo trì.

Một số lưu ý khi sử dụng Linq2Db

  • Hiệu năng cao: Linq2Db tập trung vào việc chuyển đổi truy vấn LINQ thành SQL một cách hiệu quả, cho phép tối ưu hóa hiệu năng truy cập CSDL.
  • Hỗ trợ nhiều CSDL: Bạn có thể cấu hình Linq2Db cho nhiều loại CSDL khác nhau chỉ bằng cách thay đổi provider.
  • Không có change tracking tự động: Điều này giúp tăng tốc độ nhưng đòi hỏi bạn phải tự quản lý các thao tác cập nhật, chèn và xóa dữ liệu.
  • Tích hợp dễ dàng với DI: Như các ví dụ trên, việc đăng ký DataConnection (ở đây là MyDatabase) trong DI của ASP.NET Core rất đơn giản.

Kết luận

Linq2Db là một giải pháp ORM nhẹ, nhanh chóng và hiệu quả, giúp bạn sử dụng cú pháp LINQ để truy vấn và thao tác dữ liệu trong ASP.NET Core Web API. Với khả năng tương thích với nhiều hệ quản trị cơ sở dữ liệu và cấu hình đơn giản qua Dependency Injection, Linq2Db là lựa chọn thích hợp cho các ứng dụng cần hiệu năng cao và kiểm soát chi tiết các truy vấn SQL.

Nếu bạn có thắc mắc hay cần hỗ trợ thêm về Linq2Db, hãy thoải mái đặt câu hỏi để được giải đáp!

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

pzf-icon