Bài viết giới thiệu và tìm hiểu về cách thức sử dụng LINQ to SQL, đồng thời cũng so sánh các lợi ích và nhược điểm của phương pháp này so với các cú pháp truy vấn SQL truyền thống.
C# SQL Server Huỳnh Duy Lộc 2017-05-23 15:17:10

Giới thiệu

Bài viết giới thiệu 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.

Tiền đề bài viết

Bài viết này nhằm trau dồi khả năng trình bày vấn đề của tôi và chia sẻ thêm các kiến thức hữu ích.

Đối tượng hướng đến

Lập trình viên .NET hoặc các đối tượng phát triển phần mềm tìm kiếm phương pháp tăng hiệu suất (giảm thời gian) phát triển phần mềm.

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 câu lệnh truy vấn SQL.

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 là vô cùng cần thiết. Từ trước đến nay, để truy xuất và thao tác dữ liệu chúng ta sử dụng các truy vấn SQL. Cá nhân tôi vẫn đánh giá rất cao việc này vì cấu trúc một câu truy vấn SQL mang hơi hướng gần với ngôn ngữ tự nhiên. Hãy 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, ta dễ dàng "dịch" câu truy vấn thành: Hãy lấy ra RoomName (tên một phòng) từ bảng Room (Phòng) có RoomID (mã phòng) là 1.

Tuy nhiên với những hệ quản trị cơ sở dữ liệu, file XML khác nhau các câu lệnh SQL sẽ khác biệt, do đó người lập trình phải nghiên cứu và chỉnh sửa lại đôi chút khi thao tác với từng loại cơ sở dữ liệu. Để 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ữ C#/Visual Basic .NET (VB.NET) kết hợp với những từ khóa, toán tử của LINQ là bạn dễ dàng truy vấn cũng như thao tác với dữ liệu theo phong cách C#/VB.NET. Điều này tạo cảm giác quen thuộc cho lập trình viên .NET.

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

HotelManagementContext db = new HotelManagementContext();
Var var =  (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 hay 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. Tôi thường sử dụng C# nên sử dụng C# làm ví dụ, ta biết rằng:

  • C# là một ngôn ngữ lập trình hướng đối tượng hoàn toàn.
  • SQL Server là một hệ quản trị cơ sở dữ liệu (DBMS) theo mô hình quan hệ, mô hình CSDL quan hệ ghi các dữ liệu theo dòng trong các bảng dữ liệu.

Tôi muố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 hứng 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 Database. 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?

Có vài lí do khi tôi sử dụng công cụ này rút kết ra được.

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, tôi 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 bạn qui định trong Database (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ư với 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 Database, tránh làm mất hoặc hư dữ liệu sau khi truy xuất và thao tác với 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 bạn 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 Modal được tạo tự động). Điều này khiến cho việc thay đổi thuộc tính dữ liệu trong database 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 (do những thay đổi được tự động cập nhật lại).

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ư việc mang SQL vào và viết bằng C#, tuy vậy bản chất vẫn là SQL).
   
LINQ to SQL là một công cụ tốt đối với những lập trình viên .NET, nếu có thời gian bạn nên tìm hiểu công cụ này. 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ào 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ừ Database chứ không thể tạo Database từ Data Model.
  • 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).

Lời kết

Với những ưu và nhược điểm như trên, LINQ to SQL ra đời với sứ mệnh phục vụ cho việc phát triển phần mềm, cụ thể là truy xuất và thao tác dữ liệu với hệ quản trị cơ sở dữ liệu SQL Server và lập trình trên nền tảng .NET với ngôn ngữ lập trình C#/VB.NET. Nếu bạn là một lập trình viên .NET, tôi nghĩ bạn nên giành thời gian tìm hiểu thêm kiến thức thú vị này.