Search…

LINQ to SQL - Giới Thiệu

02/08/20208 min read
Giới thiệu LINQ to SQL, ý nghĩa và cú pháp cơ bản sử dụng LINQ to SQL trong truy vấn dữ liệu.

Giới thiệu về LINQ

Language Integrated Query (LINQ) là một bộ thư viện được tích hợp vào nền tảng .NET 3.5 trở đi (19/11/2007). Mục đích ra đời của LINQ là cung cấp thêm một giải pháp truy vấn dữ liệu từ các nguồn dữ liệu như hệ quản trị cơ sở dữ liệu, file XML, ... bên cạnh cách truyền thống thông qua các truy vấn SQL.

LINQ to SQL hỗ trợ truy vấn dữ liệu thông qua cú pháp ngôn ngữ lập trình của C# hoặc Visual Basic .NET, là 1 phương pháp tăng hiệu suất (giảm thời gian) phát triển phần mềm.

Vì sao là LINQ to SQL?

Trong phát triển phần mềm, nhu cầu truy xuất và thao tác dữ liệu rất nhiều. Từ trước đến nay, sử dụng các truy vấn SQL để truy xuất và thao tác dữ liệu là việc mà các lập trình viên làm thường xuyên, nếu có thể tối ưu được về thời gian sẽ tăng được hiệu suất đáng kể.

Xem xét ví dụ về một câu truy vấn SQL sau đây:

SELECT RoomName FROM Room WHERE RoomID=1

Như ví dụ trên, câu truy vấn có nghĩa như sau:

  • Lấy ra tên phòng RoomName.
  • Từ danh sách phòng Room.
  • Có mã phòng RoomID là 1.

Với các hệ quản trị cơ sở dữ liệu khác nhau (SQL Server, MySQL, Oracle, ...), hoặc lưu trữ trong XML sẽ có các cú pháp truy vấn khác nhau và lập trình viên phải học lại 1 phần hoặc toàn bộ các truy vấn nếu có nhu cầu thay đổi hệ quản trị cơ sở dữ liệu, tốn rất nhiều thời gian và công sức.

Để tối ưu hóa qui trình phát triển phần mềm, Microsoft cho ra đời LINQ, một dạng truy vấn dữ liệu thông qua ngôn ngữ lập trình C#/Visual Basic .NET (VB.NET) kết hợp với những từ khóa, toán tử của LINQ. Lập trình viên sử dụng quen với mã C# sẽ truy vấn cơ sở dữ liệu bằng C# thay vì các truy vấn SQL dạng chuỗi.

Xem xét ví dụ trên nhưng được viết bằng cú pháp LINQ

HotelManagementContext db = new HotelManagementContext();
var query =  (from room in db.Rooms
			Where room.RoomID==1
			Select room).FirstOrDefault();

Dễ dàng thấy được chất C# trong truy vấn trên, từ db.Rooms cho đến toán tử ==, phương thức FirstOrDefault().

LINQ to SQL

Vì sao LINQ to SQL ra đời?

Mục đích ra đời của LINQ to SQL là để phục vụ cho hệ quản trị cơ sở dữ liệu SQL Server và nền tảng .NET nói chung hay ngôn ngữ lập trình C#/VB.NET nói riêng chứ không phải mục đích đại trà cho các ngôn ngữ lập trình hay các hệ quản trị cơ sở dữ liệu khác.

Tuy nhiên cũng có nhiều loại LINQ được gọi là các Providers, trong đó có:

  • LINQ to SQL: phục vụ cho SQL Server.
  • LINQ to Entities: phục vụ cho nhiều loại hệ quản trị cơ sở dữ liệu hơn.
  • LINQ to Objects: Sử dụng với các Collections, như tìm kiếm, ... theo phong cách như truy vấn cơ sở dữ liệu.
  • LINQ to DataSets: Sử dụng kết hợp với ADO.NET.
  • LINQ to XML: phục vụ cho truy vấn XML.

SQL Server là một hệ quản trị cơ sở dữ liệu theo mô hình quan hệ (RDBMS), mô hình CSDL quan hệ ghi các dữ liệu theo dòng trong các bảng dữ liệu.

Giả sử cần dùng C# viết mã để lấy dữ liệu từ SQL Server nhưng tổ chức mô hình dữ liệu của C# và SQL Server là khác nhau. Để giải quyết tình trạng trên, một kỹ thuật gọi là ORM (Object Relational Mapping) ra đời nhằm mục đích chuyển đổi dữ liệu giữa các hệ thống khác (không phải là mô hình hướng đối tượng) sang các đối tượng trong ngôn ngữ lập trình hướng đối tượng. Tiếp đó LINQ to SQL ra đời dựa trên kỹ thuật ORM xóa bỏ khoảng cách giữa mô hình lập trình hướng đối tượng C#/VB.NET với hệ quản trị cơ sở dữ liệu SQL Server khi đã mô hình hóa theo hướng đối tượng các bảng trong Database thành các lớp tương ứng khi lập trình.

Sự ra đời của LINQ to SQL giúp các lập trình viên .NET bớt đi gánh nặng phụ thuộc bên thứ 3 (dùng SQL để truy vấn). LINQ to SQL đồng thời đồng bộ hóa dữ liệu lấy ra và trả về khi truy xuất dữ liệu bằng việc các Data Model nhận dữ liệu trả về được tạo tự động sao cho tương thích với kiểu dữ liệu tương ứng của chúng khi ánh xạ vào cơ sở dữ liệu. Điều này làm tránh tình trạng mất hoặc sai lệch dữ liệu khi truy xuất và thao tác với cơ sở dữ liệu. Trên hết, một công cụ được phát hành cho nền tảng duy nhất là .NET với những anh em trong gia đình .NET sử dụng thì hiệu suất LINQ to SQL hẳn là phải tốt hơn so với những công cụ bên thứ 3.

LINQ to SQL là gì?

LINQ to SQL cũng như LINQ là thư viện tích hợp sẵn vào nền tảng .NET từ bản 3.5 trở đi. LINQ to SQL gần như được xem là một công cụ với rất nhiều tính năng, nhưng nổi trội hơn cả là mô hình hóa các dữ liệu từ SQL Server thành dạng hướng đổi tượng và sử dụng cú pháp LINQ để truy xuất và thao thác dữ liệu. Tuy nhiên LINQ to SQL chỉ chạy duy nhất với hệ quản trị cơ sở dữ liệu SQL Server.

Vì sao sử dụng LINQ to SQL?

Hỗ trợ công cụ

Khi sử dụng LINQ to SQL với hệ quản trị cơ sở dữ liệu SQL Server, không phải tạo các lớp Data Model để hứng dữ liệu trả về khi truy vấn dữ liệu vì LINQ to SQL đã tạo sẵn những lớp này với đầy đủ các thuộc tính và kiểu dữ liệu phù hợp với kiểu dữ liệu các cột được qui định trong cơ sở dữ liệu (các thuộc tính của mỗi lớp ánh xạ vào các cột của bảng tương ứng trong CSDL).

linq to sql

Như hình trên, sau khi lưu trữ file HotelData.dbml, hệ thống sẽ tạo ra các lớp Room, RoomKind, RoomStatus, OrderDetail với đầy đủ các thuộc tính và kiểu dữ liệu tương thích với dữ liệu tương ứng của chúng trong cơ sở dữ liệu.

Giao diện trực quan và tự động

LINQ to SQL cung cấp giao diện trực quan về mối quan hệ các bảng dữ liệu sau khi được mô hình hóa. Các lớp DataContext sẽ được tạo ra tự động khi Import file LINQ to SQL vào Project.

Các lớp DataContext nhận nhiệm vụ mở kết nối đến cơ sở dữ liệu, thực hiện truy vấn hay thay đổi dữ liệu. Các lớp thuộc tính được mô hình hóa từ các bảng dữ liệu trong hệ quản trị cơ sở dữ liệu được truy cập thông qua các lớp DataContext. Lớp DataContext này gần như là một lớp bao (Wrapper Class), những thay đổi nếu có từ các bảng dữ liệu trong cơ sở dữ liệu thì lớp này sẽ cập nhật và thay đổi tương ứng (chúng cũng sẽ cập nhật vào các lớp Data Model được tạo tự động). Điều này khiến cho việc thay đổi thuộc tính dữ liệu trong cơ sở dữ liệu diễn ra dễ dàng và người lập trình không mất quá nhiều công sức để chỉnh sửa lại code.

mô hình linq to sql
Mô hình LINQ to SQL

LINQ nhưng bản chất vẫn là SQL

Đúng như cái tên LINQ to SQL, các câu truy vấn LINQ sẽ được chuyển sang câu truy vấn SQL trước khi đưa vào SQL Server để truy vấn dữ liệu (LINQ to SQL giống như mang SQL vào C# để viết).
   
LINQ to SQL là một công cụ tốt đối với những lập trình viên .NET. Cấu trúc, câu lệnh của nó dễ học và quen thuộc (C#/VB.NET). LINQ to SQL rút ngắn thời gian phát triển phần mềm trên nền tảng .NET khi muốn thao tác và truy xuất dữ liệu từ cơ sở dữ liệu, hệ thống tạo và hỗ trợ tất cả những thứ cơ bản như lớp DataContext, các lớp Data Model để hứng dữ liệu, lập trình viên chỉ cần truy xuất và thao tác với dữ liệu.

Những hạn chế của LINQ to SQL

Dù là một công cụ khá hay trên nền tảng .NET, LINQ to SQL vẫn có hạn chế như:

  • Chỉ thao tác duy nhất với hệ quản trị cơ sở dữ liệu SQL Server.
  • Chỉ có thể tự động tạo Data Model từ cơ sở dữ liệu chứ không có ngược lại.
  • Chỉ cho phép ánh xạ 1:1 giữa các Table trong Database với các lớp Data Model (tức là không thể tạo 1 Data Model là kết quả kết hợp từ 2 bảng dữ liệu trở lên).
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024