LINQ khai thông rào cn truy vn
Ngu
n:quantrimang.com
Gii pháp lp trình hp nht, đem đến kh năng truy vn d liu theo cú
pháp SQL trc tiếp trong C# hay VB.NET, áp dng cho tt c các dng d
liu t đối tượng đến CSDL quan h và XML.
X lý thông tin hay d liu là nhim v quan trng nht ca bt k phn mm
nào và mt trong nhng tr ngi chính mà các nhà phát trin hin nay phi đối
mt là khác bit gia ngôn ng lp trình hướng đối tượng và ngôn ng truy vn
d liu, vn đề càng phc tp hơn vi s xut hin ca XML (eXtensible Markup
Language - ngôn ng đánh du m rng).
Hin ti, cách ph biến nht để ng dng ly d liu t các h cơ s d liu
(CSDL) là s dng SQL (Structure Query Language - ngôn ng truy vn cu
trúc). SQL có cú pháp rt khác vi nhng ngôn ng lp trình ph dng như C#
và VB.NET, do vy lp trình viên phi nhc công "hàn gn" hai thc th khác bit
này vi nhau trong mi d án phn mm.
Mt vn đề khác vi SQL là nó ch dùng để truy vn d liu trong các CSDL
dng quan h. Nếu mun truy cp d liu XML hay dng khác (như trang HTML,
email...), nhà phát trin li phi s dng cú pháp truy vn khác (XPath/XQuery).
Để gim gánh nng thao tác trên nhiu ngôn ng khác nhau và ci thin năng
sut lp trình, Microsoft đã phát trin gii pháp tích hp d liu cho .NET
Framework có tên gi là LINQ (Language Integrated Query), đây là thư vin m
rng cho các ngôn ng lp trình C# và Visual Basic.NET (có th m rng cho
các ngôn ng khác) cung cp kh năng truy vn trc tiếp d liu đối tượng,
CSDL và XML. (Hình 1)
Truy vn d liu đối tượng trong b nh
D liu cn phi đổ vào b nh để x lý, nhưng mt khi tách khi nơi gc ca nó
thì kh năng truy vn rt kém. Bn có th d dàng truy vn thông tin khách hàng
móc ni vi thông tin đơn hàng ca h t CSDL SQL Server nhưng không d
thc hin tương t vi thông tin trong b nh. Trong môi trường .NET, thông tin
(trong b nh) thường được th hin dng các đối tượng và trước LINQ,
không có cách nào để móc ni các đối tượng hay thc hin bt k thao tác truy
vn nào. LINQ chính là gii pháp cho vn đề này.
Ví d, trong SQL Server, chúng ta có th truy vn tt c record (mu tin hay
hàng) t bng (table) Customer theo cách sau:
SELECT * FROM Customer
Giá tr tr v là tp kết qu ("result set") tương t như bng d liu, cha tt c
các trường (field) ca bng Customer.
S dng LINQ, chúng ta có th thc hin truy vn tương t bng chính lnh C#
hay VB.NET, ch khác là truy vn danh sách đối tượng trong b nh thay vì bng
trong CSDL. Ví d đơn gin dưới đây s dng "ngun d liu" là mt mng
chui, trong VB.NET:
Dim names As String() =
{"Long", "Lân", "Qui",
"Phng"}
Các đối tượng trong mng
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 vn "ngun d liu" này tương t như
truy vn bng bng SQL.
Select name From name in names
Danh sách đối tượng (mng) names đây tương đương vi bng Customer
trong câu lnh SQL trên.
Vì .NET là môi trường đối tượng, mi th đều da trên đối tượng, thuc tính và
phương thc. Vì vy c ngun d liu mà chúng ta truy vn cũng như tp kết
qu tr v cũng đều là đối tượng. Do vy chúng ta cn khai báo biến cho phát
biu Select (hay kết qu ca phát biu 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 vn trên d liu đối tượng tương t như SQL trên
CSDL, chng hn như xếp th t (order), điu kin (where) hay móc ni (join)...
Tính năng truy vn các đối tượng trong b nh m ra nhiu kh năng thú v. Ví
d, bn có th truy vn tt c các textbox trong mt form có giá tr nht định, và
móc ni chúng vi các đối tượng ca mt tp hp được "hp" (union) vi tp kết
qu truy vn t CSDL hay tài liu XML.
Truy vn CSDL "thc"
Tt nhiên, d liu không ch nm trong b nh. Có 2 nơi quan trng khác thường
cha d liu là h CSDL (SQL Server) và tài liu XML (các d liu "thc" này
được lưu tr vt lý, có thi gian "sng" lâu hơn d liu "o" trong b nh). LINQ
có 2 b hàm API dùng để truy vn các ngun d liu này: DLINQ dùng truy vn
CSDL quan h (SQL) và XLINQ dùng truy vn d liu phân cp (XML).
DLINQ
DLINQ là tp các lp đặc bit cho phép th hin các bng và hàng d liu theo
dng đối tượng, nh vy có th s dng LINQ để truy vn trc tiếp CSDL. (Hình
2)
DLINQ dùng đối tượng DataContext để m kết ni đến CSDL. Sau đó dùng lp
Table<> để th hin bng d liu, và vi đối tượng này, chúng ta có th s dng
cú pháp LINQ để truy vn.
Ví d sau đây truy vn tt c khách hàng (customer) có tên công ty bt đầu bng
ch "T" t CSDL Northwind ca SQL Server, dùng cú pháp lnh ca 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
Nhng gì mà DLINQ thc hin vi CSDL thì XLINQ thc hin vi XML.
Xét chui XML sau:
<customers>
<customer>
<companyName>PC World Vietnam</companyName>
<contactName>The Gioi Vi Tinh</contactName>
</customer>
<customer>
...
</customer>
</customers>
XLINQ cho phép đưa chui XML này vào đối tượng XElement để truy vn vi 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 vn này tr v danh sách chui cha tên người liên h ca tt c khách
hàng (customer) có tên công ty bt đầu bng ch "T".
XLINQ còn có tính năng hp dn khác: to XML. Vic này cũng thc hin vi
XElement và các đối tượng XLINQ khác.
Ví d, xét d liu XML sau:
<root>
<sub> Test </sub>
</root>
Chúng ta có th to d liu XML trên vi 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 đui nhiu năm nay và được công b chính
thc ti hi ngh các nhà phát trin chuyên nghip - PDC 2005 (tháng 9). Tiếp
theo, tháng 5/2006, Microsoft đưa ra thư vin LINQ dùng th
(http://msdn.microsoft.com/data/ref/linq/) có th cài vi Visual Studio 2005. D
kiến, LINQ s được tích hp trong phiên bn Visual Studio kế tiếp có tên mã
"Orcas" (Object-Relational Component Architecture).
Mt trong nhng người có vai trò quan trng trong d án LINQ là kiến trúc sư
trưởng ca ngôn ng C# và là tác gi ca ngôn ng Turbo Pascal và Delphi
(ngôn ng có kh năng x lý d liu mnh): Anders Hejlsberg (tham gia
Microsoft t năm 1996).