Hướng dẫn LINQ to SQL

Mục lục

Bài 1: Sử dụng LINQ to SQL . 6

1. LINQ to SQL là gì? . 6

2. Mô hình hóa CSDL dùng LINQ to SQL: . 6

3. Tìm hiểu lớp DataContext . 7

4. Các ví dụ LINQ to SQL . 8

a. Lấy các Product từ CSDL . 8

b. Cập nhật một sản phẩm trong CSDL . 9

c. Chèn thêm một phân loại mới và hai sản phẩm vào CSDL . 9

d. Xóa các sản phẩm . 10

e. Gọi một thủ tục . 11

f. Lấy các sản phẩm và phân trang . 12

5. Tổng kết . 12

Bài 2: Định nghĩa các lớp mô hình dữ liệu . 13

1. Tạo ra một mô hình dữ liệu LINQ to SQL . 14

2. Các lớp thực thể . 15

3. Tạo các lớp thực thể từ CSDL . 15

4. Cách đặt tên và ngữ pháp số nhiều. 17

5. Quan hệ giữa các thực thể . 18

6. Delay/Lazy Loading . 19

7. Dùng các Stored Procedure . 19

Dùng SPROCS để cập nhật/xóa,thêm dữ liệu . 21

8. Tổng kết . 22

Bài 3: Truy vấn Cơ sở dữ liệu . 23

1. Mô hình hóa CSDL Northwind dùng LINQ to SQL. 23

2. Lấy các sản phẩm . 23

3. Trực quan hóa các câu truy vấn LINQ to SQL trong trình gỡ lỗi . 25

4. Gắn nối các câu truy vấn LINQ to SQL vào các control LINQ to SQL . 26

5. Data Sharping . 27

6. Phân trang kết quả truy vấn. 32

7. Tổng kết . 34

Bài 4: Cập nhật cơ sở dữ liệu . 35

1. CSDL Northwind được mô hình hóa dùng LINQ to SQL . 35

Change Tracking và DataContext.SubmitChanges() . 36

2. Các ví dụ Insert và Delete . 37

LINQ to SQL Tutorial

4

a. Thêm một sản phẩm . 38

b. Xóa các sản phẩm . 38

3. Cập nhật thông qua các quan hệ . 38

4. Transactions . 40

5. Kiểm tra dữ liệu và Business Logic . 41

6. Hỗ trợ kiểm tra các giá trị thuộc tính dựa trên schema của CSDL . 41

7. Hỗ trợ tùy biến việc kiểm tra giá trị các thuộc tính . 41

8. Hỗ trợ tùy biến việc kiểm tra tính hợp lệ của thực thể . 42

9. Tùy biến các phương thức kiểm tra việc thêm/xóa/sửa dữ liệu . 43

10. Nâng cao: Xem danh sách thay đổi cho Transaction . 44

11. Xử lý các thay đổi đồng thời với Optimistic Concurrency: . 45

12. Dùng SPROCs hoặc tùy biến logic các câu SQL: . 45

Bài 5: Sử dụng asp:LinqDataSource . 47

1. Ứng dụng mẫu mà chúng ta sẽ xây dựng: . 47

2. <asp:LinqDataSource> là gì và nó giúp gì cho chúng ta? . 48

Bước 1: Định nghĩa mô hình dữ liệu . 49

Bước 2: Tạo danh sách sản phẩm . 50

Bước 3: Bỏ các cột không cần thiết . 54

Bước 4: Lọc danh sách sản phẩm . 57

Bước 5: Thêm các quy tắc kiểm tra logic . 60

3. Tổng kết . 63

Bài 6: Lấy dữ liệu dùng Stored Procedure . 65

1. Dùng SPROC hay không SPROC? Đó là một vấn đề . . 65

2. Các bước ánh xạ và gọi SPROC dùng LINQ to SQL . 66

3. Cách ánh xạ một SPROC vào một DataContext của LINQ . 67

4. Cách gọi SPROC mới được tạo . 68

5. Ánh xạ kiểu trả về của phương thức SPROC vào một lớp trong mô hình dữ liệu . 69

6. Xử lý các tham số thủ tục dạng OUTPUT . 72

7. Xử lý các thủ tục trả về nhiều kiểu kết quả khác nhau. 73

Hỗ trợ các hàm do người dùng tự định nghĩa (UDF) . 75

8. Tổng kết . 77

Bài 7: Cập nhật dữ liệu dùng Stored Procedure . 78

9. Bước 1: Tạo lớp truy xuất dữ liệu (chưa dùng đến các thủ tục) . 78

Thêm các quy tắc kiểm tra dữ liệu vào các lớp mô hình dữ liệu . 78

Thêm phương thức GetCustomer() vào lớp DataContext . 80

LINQ to SQL Tutorial

5

10. Bước 2: Dùng lớp truy cập dữ liệu (chưa sử dụng SPROC) . 81

11. Chờ một giây - Tôi nghĩ bài viết này định nói về việc dùng SPROC cơ mà ??? . 82

12. Cách sử dụng SPROC để thực hiện Insert/Update/Delete . 83

13. Bước 3: Thêm một Order bằng cách dùng SPROC . 83

14. Bước 4: Thực hiện cập nhật dùng SPROC . 87

15. Bước 5: Dùng lớp DAL lần nữa . 89

16. Một số ưu điểm của việc dùng SPROC . 89

Dùng các tham số dạng output: . 89

Sẽ thế nào nếu một SPROC phát ra một lỗi? . 90

Tôi có thể viết code thay vì dung ORM designer để gọi SPROC? . 90

17. Tổng kết . 90

Bài 8: Thực thi các biểu thức SQL tùy biến . 91

1. Dùng các câu truy vấn SQL tùy biến với LINQ to SQL . 93

2. Dùng ExecuteQuery . 93

3. Tùy biến các biểu thức SQL và theo vết (tracking) các thao tác cập nhật: . 94

4. Tùy biến các biểu thức SQL với các lớp của bạn . 95

5. Tùy biến các câu SQL cho Inserts/Updates/Deletes . 95

6. Tổng kết . 96

Bài 9: Dùng biểu thức LINQ tùy biến với <asp:LinqDatasource> . 97

1. Tóm tắt: dùng <asp:LinqDataSource> với một mệnh đề where được khai báo . 97

2. Dùng các sự kiện Selecting với <asp:LinqDataSource> . 98

3. Thực hiện các phép chiếu khi truy vấn với sự kiện Selecting . 101

4. Tổng kết . 103

pdf103 trang | Chuyên mục: SQL Server | Chia sẻ: dkS00TYs | Lượt xem: 4802 | Lượt tải: 1download
Tóm tắt nội dung Hướng dẫn LINQ to SQL, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
LINQ to SQL designer, hay phải thừa kế từ bất 
kỳ class/interface nào. 
Ví dụ, bạn có thể định nghĩa một lớp ProductSummary mới chứa các thuộc tính là tập con của 
Product như dưới đây (chú ý là chúng ta dùng đặc tính Automatic Properties mới có trong C#): 
Chúng ta có thể sau đó tạo ra một phương thức tên là GetProductSummariesByCategory() trong lớp 
NorthwindDataContext, nó sẽ trả về các kết quả dựa trên kiểu ProductSummary. Để ý là câu SQL 
dưới đây chỉ yêu cầu các thuộc tính của Product nó cần – ExecuteQuery sẽ tự biết cách đưa các giá 
trị đó vào các đối tượng ProductSummary mà nó sẽ trả về. 
Sau đó chúng ta có thể dùng phương thức này để truy vấn và duyệt qua tập kết quả trả về: 
5. Tùy biến các câu SQL cho Inserts/Updates/Deletes 
Thêm vào việc dùng các biểu thức SQL tùy biến để truy vấn, bạn cũng có thể dùng chúng để thực 
hiện các thao tác như thêm/xóa/sửa. 
Chúng ta có thể làm được điều này bằng cách tạo ra các phương thức partial trong lớp DataContext 
tương ứng các thao tác Insert/Update/Delete cho thực thể mà chúng ta muốn thay đổi. Và chúng ta 
LINQ to SQL Tutorial 
96 
sau đó có thể dùng phương thức ExecuteCommand để thực thi các câu SQL cần thiết. Ví dụ, để thay 
thế hành vi Delete mặc nhiên cho lớp Product, bạn có thể định nghĩa một phương thức partial 
DeleteProduct như sau: 
Và bây giờ, nếu bạn viết đọa code dưới đây để xóa một Product nào đó khỏi CSDL, LINQ to SQL sẽ 
gọi phương thức DeleteProduct – và khi đó các câu SQL tùy biến sẽ được thực thi thay thế cho câu 
SQL được sinh ra tự động bởi LINQ to SQL: 
6. Tổng kết 
Trình quản lý LINQ to SQL tự động tạo ra và thực thi các câu SQL động để thực hiện các câu truy 
vấn, cập nhật, thêm và xóa dữ liệu trong CSDL. 
Đối với một số trường hợp, khi bạn muốn kiểm soát hoàn toàn câu lệnh SQL được thực thi, bạn có 
thể dùng các thủ tục SPROC, hay cũng có thể viết các câu SQL của riêng bạn. Điều này cung cấp 
khả năng tùy biến mạnh m 
LINQ to SQL Tutorial 
97 
Bài 9: Dùng biểu thức LINQ tùy biến với 
Trong phần 5 của loạt bài này tôi đã giới thiệu control mới trong .NET 3.5 và 
nói về cách dùng nó để gắn nối các control ASP.NET dễ dàng vào các mô hình dữ liệu LINQ to 
SQL. Tôi cũng đã trình bày một chút về cách dùng chúng trong một bài viết sau đó khi nói về control 
. 
Trong cả hai bài viết trên, các câu truy vấn được thực hiện đều tương đối dễ hiểu (mệnh đề Where 
làm việc chỉ với một bảng dữ liệu). Trong bài viết hôm nay tôi sẽ biểu diễn cách tận dụng khả năng 
xây dựng các câu truy vấn nhanh chóng với LINQ dùng LinqDataSource, và cách bạn có thể dùng 
bất kỳ biểu thức LINQ nào để thực hiện truy vấn với nó. 
1. Tóm tắt: dùng với một mệnh đề where được khai báo 
Trong 2 bài viết đó tôi đã biểu diễn cách bạn có thể dùng các bộ lọc có sẵn của LinqDataSource để 
khai báo nhanh một bộ lọc trên một mô hình dữ liêu LINQ to SQL. 
Ví dụ, cho là bạn đã tạo ra một mô hình dữ liệu LINQ to SQL của CSDL Northwind (cách dùng đã 
được nói đến trong phần 2 của loạt bài này), chúng ta có có thể khai báo một control 
 trên trang với một mệnh để mà nó chỉ trả về các sản phẩm thuộc 
một chủng loại nào đó (được chỉ ra qua tham số “categoryid” của chuỗi query string): 
Chúng ta có thể trỏ một control đến datasource đã tạo và cho phép phân trang, chỉnh 
sửa và sắp xếp: 
Khi chạy trang trên, chúng ta sẽ có một GridView với khả năng tự động sắp xếp, phân trang cũng 
như chỉnh sửa dữ liệu dữ trên dữ liệu có trong mô hình dữ liệu của chúng ta: 
LINQ to SQL Tutorial 
98 
Dùng cách khai báo các tham số cho where giống như trên có thể làm việc tốt trong hầu hết trường 
hợp. Nhưng sẽ thế nào nếu bạn muốn câu lệnh lọc phức tạp hơn? Ví dụ, sẽ thế nào nếu chúng ta chỉ 
muốn hiển thị các sản phẩm được tạo bới các nhà cung cấp dựa trên một tập động các quốc gia? 
2. Dùng các sự kiện Selecting với 
Để xử lý các trường hợp trên, bạn có thể tạo các hàm xử lý cho các sự kiện “Selecting” thuộc control 
. Bên trong các hàm xử lý sự kiện này, bạn có thể viết bất kỳ đoạn lệnh nào 
bạn muốn để lấy về tập kết quả. Bạn có thể làm được điều này với một câu truy vấn LINQ, gọi một 
thủ tục SPROC hay dùng một biểu thức SQL tùy biến. Một khi đã lấy dữ liệu về, những gì cần làm là 
gán nó cho thuộc tính “Result” của đối tượng LinqDataSourceSelectEventArgs. Control 
 khi đói sẽ dùng tập kết quả do bạn trả về để làm việc. 
Ví dụ, dưới đây là một câu truy vấn LINQ to SQL để lấy về chỉ các sản phẩm từ các nhà cung cấp 
thuộc các nước được chọn: 
VB: 
LINQ to SQL Tutorial 
99 
C#: 
Ghi chú: Bạn không cần viết câu truy vấn ngay bên trong hàm xử lý sự kiện. Một cách tiếp cận sáng 
sủa hơn là đưa các câu lệnh truy vấn vào trong các hàm trợ giúp, và sau đó gọi lại chúng từ các hàm 
xử lý sự kiện. Tôi đã dùng cách tiếp cận này trong phần đầu của bài 8 (dùng hàm trợ giúp 
GetProductsByCategor). 
Bây giờ, bằng cách dùng hàm xử lý Selecting, mỗi khi chạy bạn sẽ chỉ thấy các sản phẩm được cung 
cấp bởi các nhà cung cấp đến từ các quốc gia mà chúng ta đã cho trước. 
LINQ to SQL Tutorial 
100 
Một trong những điều thật sự thú vị là các chức năng phân trang và sắp xếp vẫn làm việc với 
GridView của chúng ta – dù rằng chúng ta đã chuyển sang dùng sự kiện Selecting. Và quan trọng là 
việc phân trang cũng như sắp xếp này được thực hiện bên trong CSDL – có nghĩa là chúng ta chỉ lấy 
về 10 sản phẩm từ CSDL mà chúng ta cần để hiển thị cho trang hiện tại trên GridView, điều này giúp 
việc thực thi hiệu quả hơn rất nhiều. 
Bạn có lẽ sẽ tự hỏi – làm sao nó có thẻ hỗ trợ việc sắp xếp và phân trang hiệu quả như vậy ngay cả 
khi ta dùng sự kiện Selecting? Lý do là vì câu truy vấn LINQ sẽ không được thực thi tới chừng nào 
bạn còn chưa lấy kết quả trả về của nó (deferred execution model). Ưu điểm của mô hình này là nó 
cho phép bạn dễ dàng soạn câu truy vấn trước khi thực thi nó, cũng như dễ dàng đưa thêm các tính 
năng “add-on” và. Bạn có thể tìm hiểu kỹ hơn trong phần 3 của loạt bài này. 
Trong hàm xử lý sự kiện “Selecting” ở trên chúng ta khai báo câu truy vấn LINQ chúng ta muốn 
thực thi và sau đó gán nó vào thuộc tính e.Query. Mặc dù vậy, câu lênh LINQ không được thực thi vì 
chúng ta không lấy kêt quả của nó (bằng cách dùng những hàm như ToArray() hay ToList()). 
LINQDataSource sau đó sẽ có thể thêm mệnh đề order by, và nối thêm các hàm mở rộng Take() và 
Skip(), nhờ vậy mà tập kết quả sẽ được phân trang và sắp xếp. Chỉ khi đó LINQDataSource mới thực 
hiện câu lệnh LINQ và lấy dữ liệu về, và LINQ to SQL sẽ đảm bảo rằng việc sắp xếp và phân trang 
này được thực hiện bên trong CSDL – và chỉ có đúng 10 dòng được trả về. 
Chú ý dưới đây chúng ta vẫn dùng GridView để chỉnh sửa và xóa dữ liệu, ngay cả khi dùng sự kiện 
“Selecting” của LinqDataSource: 
LINQ to SQL Tutorial 
101 
Khả năng hỗ trợ việc xóa/sửa dữ liệu sẽ còn làm việc chừng nào thuộc tính Query của sự kiện 
Selecting còn được gán một tập các thực thể cùng loại (ví du: một dãy các đối tượng kiểu Product, 
Supplier, Category, Order…). LINQDataSource khi đó sẽ có thể tự động xử lý các trường hợp UI 
control thực hiện việc cập nhật đối với nó. 
Để học thêm về cách cập nhật trong LINQ to SQL, xin đọc lại bài 4 của loạt bài này. Và sau đó đọc 
tiếp bài 5 để xem cách cập nhật với LINQDataSource. 
3. Thực hiện các phép chiếu khi truy vấn với sự kiện Selecting 
Một trong những điểm mạnh của LINQ là khả năng trả về các “dạng” dữ liệu tùy biến, hay còn gọi là 
phép chiếu dữ liệu. Đó là khả năng mà bạn chỉ trả về một tập con các giá trị của thực thể (một số cột 
nào đó mà thôi), hay trả về các giá trị được tính toán tự động bằng các biểu thức do bạn định nghĩa. 
Bạn có thể tìm hiểu thêm cách LINQ thực hiện các phép chiếu này trong phần 3 của loạt bài này. 
Ví dụ, bạn có thể sửa lại sự kiện hàm xử lý sự kiện Selecting để đưa thông tin vào cho GridView một 
tập tùy biến các giá trị của Product. Trong grid này, ta sẽ chỉ hiển thị ProductID, ProductName, 
Product UnitPrice, số lệnh đặt hàng trên sản phẩm này (Number of Orders), và doanh thu của sản 
phẩm (Revenue). Chúng ta có thể tính toán động 2 giá trị cuối dùng một biểu thức LINQ như dưới 
đây: 
VB: 
LINQ to SQL Tutorial 
102 
C#: 
Ghi chú: hàm Sum được dùng để tính toán Revenue ở trên là một ví dụ về “Phương thức mở rộng” 
(Extension Method). Tham số được truyền cho hàm này là một ví dụ về biểu thức Lambda. Kiểu trả 
về được tạo bởi biểu thức LINQ là một kiểu vô danh (anonymous type) và nó được hình thành từ biểu 
thức truy vấn. Extension Methods, Lambda Expressions, và Anonymous Types là các đặc tính mới 
của VB và C# trong VS 2008. 
Kết quả của biểu thức LINQ trên khi gắn nối vào GridView sẽ tương tự như sau: 
LINQ to SQL Tutorial 
103 
Ghi chú rằng việc phân trang và sắp xếp sẽ vẫn làm việc bình thường với GridView của chúng ta – 
dù rằng chúng ta đã chuyển sang dùng câu lệnh LINQ tùy biến. 
Dù vậy, vẫn có một tính năng sẽ không làm việc khi dùng phép chiếu dữ liệu, đó là việc hỗ trợ cập 
nhật dữ liệu ngay trong GridView. Đó là vì LINQDataSource không biết cách nào để cập nhật dữ 
liệu một cách an toàn. Nếu chúng ta muốn thêm khả năng cập nhật vào cho GridView để hỗ trợ các 
kiểu trả về tùy biến như vậy, chúng ta hoặc sẽ phải chuyển sang dùng một control ObjectDataSource 
(ta phải cung cấp thêm phương thức Update để xử lý việc cập nhật), hoặc phải cung cấp thêm một 
trang để người dùng cập nhật – và hiển thị môt DetailsView hay FormViewgắn nối và thực thể 
Product để chỉnh sửa. 
4. Tổng kết 
Bạn có thể dễ dàng thực hiện các thao tác truy vấn thường dùng với mô hình dữ liệu LINQ to SQL 
dùng khả năng khai báo các bọ lọc của LINQDataSource. 
Để thực hiện biểu thức lọc phức tạp hơn, bạn có thể tận dụng ưu điểm của sự kiên Selecting có trong 
LINQDataSource. Điều này cho phép bạn thực hiện bất kỳ logic nào bạn muốn để lấy về các dòng 
dữ liệu phù hợp. Bạn có thể nhiều cách để lấy dữ liệu này, chẳng hạn dùng Query Expressions, gọi 
Stored Procedures, hay thực hiện một câu truy vấn tùy biến. 

File đính kèm:

  • pdfHướng dẫn LINQ to SQL.pdf
Tài liệu liên quan