ƯU VÀ NHƯỢC ĐIỂM CỦA LINQ

Một phần của tài liệu Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010 (Trang 54)

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 hung phc tp

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. Khnăng tái sử dng

Đâ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 hp :

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. To hình d liu:

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. Kim tra li ngay khi biên dch:

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

Một phần của tài liệu Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010 (Trang 54)

Tải bản đầy đủ (PDF)

(60 trang)