^Back To Top
Trong quá trình xây dựng ứng dụng 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. Đặc biệt, với SQLExpress để truy vấn dữ liệu phải dùng đến các câu lệnh phức tạp, hơn nữa để dùng trong ngôn ngữ lập trình C# lại thêm một vấn đề phức tạp nữa với các câu lệnh ConnectionString khởi tạo kết nối tới Database, tự khai báo các biến để chạy một dòng lệnh, rồi phải tính toán đầu ra của câu lệnh,…. Đó thực sự là một bài toán khó nếu như xây dựng một chương trình lớn. Câu hỏi đặt ra là làm sao để giải quyết vấn đê này? Một đề xuất được đưa ra là sử dụng LINQ to SQL. Bài viết dưới đây tìm hiểu về lập trình LinQ, sơ đồ và kiến trúc của LINQ, giúp người đọc hiểu khái quát về LINQ to SQL.
1. LINQ là gì?
Dữ liệu, linh hồn của một phần mềm, và việc xử lý dữ liệu luôn là một trong những vấn đề quan trọng nhất của mỗi phần mềm. Với những dữ liệu có cấu trúc, ta thường cài đặt các câu lệnh xử lý dữ liệu sao cho phù hợp với cấu trúc nhất. Tuy nhiên vấn đề trở nên phức tạp hơn khi cấu trúc dữ liệu bị thay đổi, có nhiều mảng muốn xử lý cùng lúc, đặc biệt là XML. Hãng Microsoft đã hiểu được tầm quan trọng của việc xử lý dữ liệu, và đã đưa ra LINQ ở phiên bản .NET Framework 3.5 vào tháng 11/2007.
LINQ (Language Integrated Query - ngôn ngữ truy vấn tích hợp) đưa ra 1 mô hình bền vững để hoạt động với các dạng nguồn dữ liệu và định dạng dữ liệu khác nhau. Trong LINQ, bạn phải làm quen với chuyện làm việc với các đối tượng (objects). LINQ cho phép dùng các đoạn code đơn giản để truy vấn và chuyển đổi dữ liệu trong các tài liệu XML, cơ sở dữ liệu SQL, tập dữ liệu ADO.NET, các tập hợp .NET, và bất kỳ định dạng nào mà LINQ provider hỗ trợ.
Để hiểu được tầm quan trọng của LINQ, hãy cùng xét 1 ví dụ sau:
Có 1 mảng SINHVIEN chứa thông tin tất cả các học sinh của 1 trường, và 1 mảng LOPHOC chứa thông tin phòng học. Sẽ thật dễ dàng nếu đưa ra yêu cầu truy vấn “tìm tất cả sinh viên có độ tuổi lớn hơn 20”.
SinhVien [] MangSinhVien = {
new SinhVien() {MaSV = 1, Ten = ‘Minh’, Tuoi = 20, MaTruong = 1},
new SinhVien() {MaSV = 2, Ten = ‘Hoa’, Tuoi = 20, MaTruong = 2},
new SinhVien() {MaSV = 3, Ten = ‘Phú’, Tuoi = 21, MaTruong = 1},
new SinhVien() {MaSV = 4, Ten = ‘Linh’, Tuoi = 19, MaTruong = 1},
new SinhVien() {MaSV = 5, Ten = ‘Cường’, Tuoi = 20, MaTruong = 3},
new SinhVien() {MaSV = 6, Ten = ‘Đạt’, Tuoi = 20, MaTruong = 2},
}
TruongHoc [] MangTruong = {
new TruongHoc() {MaTruong = 1, Ten = ‘Đại học Hà Tĩnh’},
new TruongHoc () {MaTruong = 2, Ten = ‘Cao đẳng Việt Đức’},
new TruongHoc () {MaTruong = 3, Ten = ‘Cao Đẳng Y Hà Tĩnh’}
}
foreach SinhVien sv in MangSinhVien
{
if (sv.Tuoi = ‘20’)
//Hiển thị;
}
}
Nhưng nếu câu truy vấn được đặt ra là “tìm sinh viên tên Minh học ở trường nào” thì sao? Phải tạo 1 mảng mới, trộn các dữ liệu từ 2 MangSinhVien và MangTruong và chạy vòng foreach? Tuy nhiên với LinQ, mọi thứ sẽ đơn giản hơn rất nhiều:
{
var truyvan = form sv in MangSinhVien
join tentruong in MangTruong
on sv.MaTruong equals tentruong.matruong
where sv.ten = ‘Minh’
select tentruong;
}
Chỉ cần 1 câu lệnh “ JOIN ” của LinQ là xong. Rất đơn giản!!!
2. Kiến trúc và thành phần của LINQ
Hình 1. Kiến trúc và các thành phần của LINQ
- SQL Sever Databases: LinQ to SQL
Cho phép truy vấn các cơ sở dữ liệu quan hệ
- XML documents: LinQ to XML
Sử dụng LinQ to XML với mục đích truy vấn file XML Documents
- ADO.NET datasets: LINQ to Dataset
Cho phép truy vấn các Dataset hoặc DataTable
- .NET collections, strings, files, …: LinQ to Objects
Cho phép truy vấn các đối tượng trong một tập các phần tử nguồn, các kiểu đối tượng này phải thực thi giao diện Ienumrable hoặc Ienumrable.
- Entyti Framework: LinQ to Entities
Cho phép truy vấn các thực thể bên trong Entity Framework.
3. LINQ To SQL
3.1. Sự ra đời của LINQ to SQL
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. 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.
Muốn dùng ngôn 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 thành viên trong .NET sử dụng thì hiệu suất của LINQ to SQL sẽ tốt hơn so với những công cụ bên thứ 3.
3.2. Vì sao nên sử dụng LINQ to SQL?
- Một công cụ hỗ trợ đắc lực
Khi sử dụng LINQ to SQL với hệ quản trị cơ sở dữ liệu SQL Server, người dùng 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).
- 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 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 (những thay đổi được tự động cập nhật lại).
Hình 2. Giao diện trực quan và tự động của LINQ to SQL
- LINQ nhưng bản chất vẫn là 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. 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.
TÀI LIỆU THAM KHẢO
[1]. http://www.sqltolinq.com/
[2]. https://www.tutorialspoint.com/linq/linq_sql.htm
[3]. https://namdh.wordpress.com/2008/12/04/linq-book/
[4]. https://goo.gl/j3wmFf