LINQ khai thông rào cản truy vấn
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. 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 ...
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.
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;
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ử (http://msdn.microsoft.com/data/ref/linq/) 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