Linq không chỉ dành cho những câu truy vấn, ngoài ra nó còn được dùng để chuyển đổi kiểu dữ liệu
string[] numbers = { "0042", "010", "9", "27" };
int[] nums = numbers.Select(s => Int32.Parse(s)).ToArray();
foreach(int num in nums)
Console.WriteLine(num); CTRL + F5:
Sắp xếp dữ liệu
string[] numbers = { "0042", "010", "9", "27" };
int[] nums = numbers.Select(s => Int32.Parse(s)).OrderBy(s => s).ToArray();
foreach (int num in nums) Console.WriteLine(num); CTRL + F5:
55
Ưu điểm của LINQ so với SQL
1. Đơn giản hơn trong những tình huống phức tạp
Ví dụ:
Viếu một câu hỏi để tìm tên những khách hàng có tên bắt đầu bằng chữA, đổi sang chữ hoa và sắp theo thứ tự.
Với SQL ta sẽ viết Code:
SELECTUPPER(Name) FROM Customer
WHEREName
LIKE'A%'
ORDERBYName
Nhưng vấn đề đặt ra nếu ta muốn chỉ truy vấn từ hang 21 đến 30 thôi, ta sẽ phải thêm một câu hỏi con, cấu trúc lập tứ sẽ phức tạp và rắc rối:
BEGIN
SELECTTOP 10 UPPER(c1.Name) FROM Customer c1
WHERE c1.NameLIKE'A%'AND c1.ID NOTIN(SELECTTOP 20 c2.ID FROM Customer c2
WHERE c2.NameLIKE'A%'
ORDERBY c2.Name )
56
Không chỉ phức tạp và rắc rối, câu hỏi trên còn vi phạm nguyên lý DRY( không tự lặp lại).
Đây là câu truy vấn viết bằng LINQ trong C#, rất dể hiểu: Code:
var query=from c in db.Customers
where c.Name.StartsWith("A") orderby c.Name.ToUpper(); var thirdPage=query.Skip(20).Take(10);
2. Khảnăng tái sử dụng
Đây là một lới ích nhờ dùng LINQ
LINQ cung cấp khảnăng tổng quát hóa, nhằm tái sử dụng.
Trong ví dụ trên ta đã tạo query trong hai bước, ta có thể tổng quát hóa bước thứ 2,
để nó có thể thực hiện Skip và Take với đối số bất kỳ thay vì 20 và 10 Code:
IQueryable<T> Paginate<T> (thisIQueryable<T> query, int skip, int take) {
return query.Skip(skip).Take(take); }
Chú ý rằng ta đã sử dụng kỹ thuật Extension Method để thêm phương thứ Paginate. Có
được phương thức Paginate ta có thể viết lại câu lệnh Code:
var thirdPage=query.Skip(20).Take(10);
ởtrên như sau:
Code:
var thirdPage=query.Paginate(20,10);
Chú ý rằng phương thức Paginate có thểứng dụng với mọi query sau khi đã được
57
Tóm lại : LINQ cho chúng ta cách chia query thành những phần nhỏ để có thể sử
dụng lại, giảm bớt công sức biên soạn lại từđầu, một ưu điểm lớn so với SQL.
3. Sự liên hợp :
Ví dụ :
Ta cần liệt kê ra tất cả khoản thu có được từ khách hàng sống ở Washington mà
đã trả tiền mua những mặt hàng có giá tổng cộng vượt quá 1000 $. Như vậy ta cần ghép các mục sau :
Các khoản thu. Tên khách hàng.
Địa chỉ khách hàng. Mặt hàng được mua
Với LINQ câu truy vấn rất dễ dàng from p in db.Purchases
where p.Customer.Address.State=="WA"
where p.PurchaseItems.Sum (pi=> pi.SaleAmount)>1000 select p
Ta có thể thấy không cần phép ghép, nhóm và câu truy vấn con. (ởđây ta đã dùng biểu thức Lambda khái niệm đặc trưng của lập trình hàm)
Mở rộng ví dụ trên, giả sử ta muốn liệt kê theo thứ tự ngược của giá trị, và thêm cả tên
người bán hàng và sốhang được mua và trong phép chiếu cuối cùng. Ta viết như sau: from p in db.Purchases
where p.Customer.Address.State=="WA"
let purchaseValue=p.PurchaseItems.Sum (pi=> pi.SaleAmount) where purchaseValue>1000
orderby purchaseValue descending select new { p.Description, p.Customer.SalesPerson.Name, PurchaseItemCount=p.PurchaseItem.Count() }
58
Tuân thủđúng nguyên lý DRY
Kỷ thuật Tuple được vận dụng làm cho mã gọn gàng và đơn giản.
4. Tạo hình dữ liệu:
Trong SQL các câu hỏi trả về tập hợp “phẳng” của các kết quả. Tuy nhiên sẽ hữu ích hơn
nếu làm việc với dữ liệu phan cấp. Chẳng hạn, chúng ta muốn lấy một vùng chọn trên các khách hàng mà chỉ ra các giá trị lớn mà mỗi khách hàng đã trả. LINQ cho ta cách làm
như sau:
Code
from c in db.Customers where c.Address.State=="WA" selectnew { c.Name, HighValuePurchases=c.Purchases (p=>p.Price>1000) } 5. Tham số hóa:
Ta có thểthay đoạn Code: where c.Address.State=="WA" Bằng Code:
where c.Address.State==state
Trong đó state là một biến string đã được khai báo và khởi tạo giá trị. Code
string state="WA";
6. Kiểm tra lỗi ngay khi biên dịch:
Trong phép truy vấn vừa nêu, nếu khai báo state là một biến kiểu int, ngay khi biên dịch, lỗi đã được pháp hiện. Nói chung là có bất cứđiều gì sai về cú pháp trong các câu truy vấn thì đều phát hiện ngay khi biên dịch. Đây là một lợi thế quan trọng so với SQL.
59
Dùng SQL phải trong quá trình chạy mới phát hiện ra lỗi vì khi đó câu lệnh SQL mới được sử lý bởi hệ quản trị CSDL.
7. Xử lý tại client:
Chẳng hạn như Database Server chịu nhiều gánh nặng, ta cần phải đẩy nhanh hoạt
động. Nếu ta vẫn làm mọi việc lọc dữ liệu ngay trên server bạn có thể giúp cho việc hoạt
động tốt hơn bằng cách tổ chức lại đểđưa kết quả ra.
Với LINQ, ta chỉ phải đưa AsEnumerable() vào Query và từđó mọi thứđược thực thi tại địa phương.
8. Tổng quát hơn SQL:
LINQ làm việc được với database và cả tài liệu XML và các đối tượng, trong khi SQL chỉ làm việc với database
9. Có cú pháp hòa nhập
Nhờ LINQ có cú pháp hòa nhập với cú pháp của C# hay VB.NET nên chương
trình trởnên đồng nhất, người dùng C# hay VB.NET đều đễ dàng sử dụng LINQ của mình
Kết luận:
LINQ có nhiều ưu điểm mạnh hơn SQL, tuy nhiên ta vẫn có thểdùng SQL để giải quyết các vấn đề giản đơn và một số vấn đề mà tạm thờLINQ chưa thay thếđược SQL.
60
TÀI LIỆU THAM KHẢO
1. Joseph Rattz and AdamFreeman: Pro LINQ—Language Integrated Query in C# 2010