(Post 06/04/2007) Giải pháp lập trình hợp nhất,
đem đến khả năng truy vấn dữ liệu theo cú pháp SQL trực tiếp trong C#
hay VB.NET, áp dụng cho tất cả các dạng dữ liệu từ đối tượng đến CSDL
quan hệ và XML.
Hình 1 |
|
Xử lý thông tin hay dữ liệu là nhiệm vụ quan trọng nhất
của bất kỳ phần mềm nào và một trong những trở ngại chính mà các nhà phát
triển hiện nay phải đối mặt là khác biệt giữa ngôn ngữ lập trình hướng
đối tượng và ngôn ngữ truy vấn dữ liệu, vấn đề càng phức tạp hơn với sự
xuất hiện của XML (eXtensible Markup Language - ngôn ngữ đánh dấu mở rộng).
Hiện tại, cách phổ biến nhất để ứng dụng lấy dữ liệu
từ các hệ cơ sở dữ liệu (CSDL) là sử dụng SQL (Structure Query Language
- ngôn ngữ truy vấn cấu trúc). SQL có cú pháp rất khác với những ngôn
ngữ lập trình phổ dụng như C# và VB.NET, do vậy lập trình viên phải nhọc
công "hàn gắn" hai thực thể khác biệt này với nhau trong mỗi
dự án phần mềm.
Một vấn đề khác với SQL là nó chỉ dùng để truy vấn dữ
liệu trong các CSDL dạng quan hệ. Nếu muốn truy cập dữ liệu XML hay dạng
khác (như trang HTML, email...), nhà phát triển lại phải sử dụng cú pháp
truy vấn khác (XPath/XQuery).
Để giảm gánh nặng thao tác trên nhiều ngôn ngữ khác nhau
và cải thiện năng suất lập trình, Microsoft đã phát triển giải pháp tích
hợp dữ liệu cho .NET Framework có tên gọi là LINQ (Language Integrated
Query), đây là thư viện mở rộng cho các ngôn ngữ lập trình C# và Visual
Basic.NET (có thể mở rộng cho các ngôn ngữ khác) cung cấp khả năng truy
vấn trực tiếp dữ liệu đối tượng, CSDL và XML. (Hình 1)
Truy vấn dữ liệu đối tượng trong bộ nhớ
Dữ liệu cần phải đổ vào bộ nhớ để xử lý, nhưng một khi
tách khỏi nơi gốc của nó thì khả năng truy vấn rất kém. Bạn có thể dễ
dàng truy vấn thông tin khách hàng móc nối với thông tin đơn hàng của
họ từ CSDL SQL Server nhưng không dễ gì thực hiện tương tự với thông tin
trong bộ nhớ. Trong môi trường .NET, thông tin (trong bộ nhớ) thường được
thể hiện ở dạng các đối tượng và trước LINQ, không có cách nào để móc
nối các đối tượng hay thực hiện bất kỳ thao tác truy vấn nào. LINQ chính
là giải pháp cho vấn đề này.
Ví dụ, trong SQL Server, chúng ta có thể truy vấn tất
cả record (mẫu tin hay hàng) từ bảng (table) Customer theo cách sau:
SELECT * FROM Customer
Giá trị trả về là tập kết quả ("result set")
tương tự như bảng dữ liệu, chứa tất cả các trường (field) của bảng Customer.
Sử dụng LINQ, chúng ta có thể thực hiện truy vấn tương
tự bằng chính lệnh C# hay VB.NET, chỉ khác là truy vấn danh sách đối tượng
trong bộ nhớ thay vì bảng trong CSDL. Ví dụ đơn giản dưới đây sử dụng
"nguồn dữ liệu" là một mảng chuỗi, trong VB.NET:
Dim names As String() = {"Long", "Lân",
"Qui", "Phụng"}
Các đối tượng trong mảng names có tên là name.
ForEach name As String in names
' name.xxx
EndFor
Dùng cú pháp LINQ, chúng ta có thể truy vấn "nguồn
dữ liệu" này tương tự như truy vấn bảng bằng SQL.
Select name From name in names
Danh sách đối tượng (mảng) names ở đây tương đương với
bảng Customer trong câu lệnh SQL ở trên.
Vì .NET là môi trường đối tượng, mọi thứ đều dựa trên
đối tượng, thuộc tính và phương thức. Vì vậy cả nguồn dữ liệu mà chúng
ta truy vấn cũng như tập kết quả trả về cũng đều là đối tượng. Do vậy
chúng ta cần khai báo biến cho phát biểu Select (hay kết quả của phát
biểu Select), ví dụ:
Dim result As IEnumerable (Of String) = Select name
From name in names
Tương tự, trong C#:
IEnumerable<String> result = from name in names
select names;
LINQ có đủ các toán tử truy vấn trên dữ liệu đối tượng
tương tự như SQL trên CSDL, chẳng hạn như xếp thứ tự (order), điều kiện
(where) hay móc nối (join)...
Tính năng truy vấn các đối tượng trong bộ nhớ mở ra nhiều
khả năng thú vị. Ví dụ, bạn có thể truy vấn tất cả các textbox trong một
form có giá trị nhất định, và móc nối chúng với các đối tượng của một
tập hợp được "hợp" (union) với tập kết quả truy vấn từ CSDL
hay tài liệu XML.
Truy vấn CSDL "thực"
Tất nhiên, dữ liệu không chỉ nằm trong bộ nhớ. Có 2 nơi
quan trọng khác thường chứa dữ liệu là hệ CSDL (SQL Server) và tài liệu
XML (các dữ liệu "thực" này được lưu trữ vật lý, có thời gian
"sống" lâu hơn dữ liệu "ảo" trong bộ nhớ). LINQ có
2 bộ hàm API dùng để truy vấn các nguồn dữ liệu này: DLINQ dùng truy vấn
CSDL quan hệ (SQL) và XLINQ dùng truy vấn dữ liệu phân cấp (XML).
DLINQ
DLINQ là tập các lớp đặc biệt cho phép thể hiện các bảng
và hàng dữ liệu theo dạng đối tượng, nhờ vậy có thể sử dụng LINQ để truy
vấn trực tiếp CSDL. (Hình 2)
DLINQ dùng đối tượng DataContext để mở kết nối đến CSDL. Sau đó dùng lớp
Table<> để thể hiện bảng dữ liệu, và với đối tượng này, chúng ta
có thể sử dụng cú pháp LINQ để truy vấn.
Ví dụ sau đây truy vấn tất cả khách hàng (customer) có
tên công ty bắt đầu bằng chữ "T" từ CSDL Northwind của SQL Server,
dùng cú pháp lệnh của C#:
DataContext context =
new DataContext("Initial Catalog=Northwind;"
+
"Integrated Security=sspi");
Table<CustomerTable> customers =
context.GetTable<CustomerTable>();
var result =
from c in customers
where c.CompanyName.StartsWith("T")
select c;
Hình 2 |
|
XLINQ
Những gì mà DLINQ thực hiện với CSDL thì XLINQ thực hiện
với XML.
Xét chuỗi XML sau:
<customers>
<customer>
<companyName>PC World Vietnam</companyName>
<contactName>The Gioi Vi Tinh</contactName>
</customer>
<customer>
...
</customer>
</customers>
XLINQ cho phép đưa chuỗi XML này vào đối tượng XElement
để truy vấn với cú pháp LINQ.
XElement names = XElement.Parse(xmlString);
var result =
from n in names.Descendants("customer")
where n.Descendants("companyName")
.Value.StartsWith("T")
select n.Descendants("contactName").Value;
Truy vấn này trả về danh sách chuỗi chứa tên người liên
hệ của tất cả khách hàng (customer) có tên công ty bắt đầu bằng chữ "T".
XLINQ còn có tính năng hấp dẫn khác: tạo XML. Việc này
cũng thực hiện với XElement và các đối tượng XLINQ khác.
Ví dụ, xét dữ liệu XML sau:
<root>
<sub> Test </sub>
</root>
Chúng ta có thể tạo dữ liệu XML trên với các đối tượng
XLINQ.
XElement xml = new XElement("root",
new XElement("sub","Test");
Console.Write(xml.ToString());
Thông tin thêm về LINQ
Dự án LINQ đã được Microsoft theo đuổi nhiều năm nay
và được công bố chính thức tại hội nghị các nhà phát triển chuyên nghiệp
- PDC 2005 (tháng 9). Tiếp theo, tháng 5/2006, Microsoft
đưa ra thư viện LINQ dùng thử có thể cài với Visual Studio 2005. Dự
kiến, LINQ sẽ được tích hợp trong phiên bản Visual Studio kế tiếp có tên
mã "Orcas" (Object-Relational Component Architecture).
Một trong những người có vai trò quan trọng trong dự
án LINQ là kiến trúc sư trưởng của ngôn ngữ C# và là tác giả của ngôn
ngữ Turbo Pascal và Delphi (ngôn ngữ có khả năng xử lý dữ liệu mạnh):
Anders Hejlsberg (tham gia Microsoft từ năm 1996).
Phương Uyên
Tham khảo:
LINQ, CoDe Magazine, 3/2006
LINQ Project Overview, Microsoft, 5/2006
(theo PC World VN) |