boo_xig

New Member

Download miễn phí Giáo trình LINQ to SQL - Phần Thực thi các biểu thức SQL tùy biến





Dùng ExecuteQuery
cách ExecuteQuery nhận vào một câu SQL, cùng với một tập các tham số mà ta
có thể dùng để tạo nên câu SQL. Bằng cách dùng nó, bạn có thể thực thi bất kỳ câu lệnh
SQL bạn muốn với CSDL (kể các câu lệnh JOIN nhiều bảng).
Điều làm cho ExecuteQuery thực sự hữu dụng là nó cho phép bạn chỉ ra cách nó trả về
dữ liệu. Bạn có thể làm được điều này bằng cách truyền một đối tượng có kiểu mong
muốn như một tham số của cách, hay dùng kiểu generic.
Ví dụ, bạn có thể thay đổi cách GetProductsByCategory() được tạo ra trước đây –
phiên bản dùng một biểu thức LINQ – để dùng cách ExecuteQuery thực thi một
câu SQL với CSDL và trả về một tập đối tượng Product như kết quả:



Để tải bản Đầy Đủ của tài liệu, xin Trả lời bài viết này, Mods sẽ gửi Link download cho bạn sớm nhất qua hòm tin nhắn.
Ai cần download tài liệu gì mà không tìm thấy ở đây, thì đăng yêu cầu down tại đây nhé:
Nhận download tài liệu miễn phí

Tóm tắt nội dung tài liệu:

Thực thi các biểu thức SQL tùy biến (LINQ to SQL phần 8)
Vài tuần trước tui bắt đầu viết loạt bài về LINQ to SQL. LINQ to SQL là một bộ khung
(framework) có sẵn cho O/RM (object relational mapping) trong .NET 3.5, nó cho phép
bạn dễ dàng mô hình hóa các CSDL quan hệ dùng các lớp .NET. Bạn có thể dùng các
biểu thức LINQ để truy vấn CSDL, cũng như có thể cập nhật/thêm/xóa dữ liệu từ đó.
Dưới đây là 7 phần đầu tiên của loạt bài này:
Sử dụng LINQ to SQL (phần 1)
Định nghĩa các lớp mô hình dữ liệu (phần 2)
Truy vấn Cơ sở dữ liệu (phần 3)
Cập nhật cơ sở dữ liệu (LINQ to SQL phần 4)
Sử dụng asp:LinqDataSource (phần 5)
Lấy dữ liệu dùng Stored Procedure (LINQ to SQL phần 6)
Cập nhật dữ liệu dùng Stored Procedure (LINQ to SQL phần 7)
Thực thi các biểu thức SQL tùy biến (LINQ to SQL phần 8)
Trong hai bài cuối (bài 6 và bài 7), tui đã biểu diễn cách bạn có thể dùng các thủ tục trong
CSDL (SPROC) để thực hiện truy vấn, cập nhật, thêm hay xóa dữ liệu dùng mô hình dữ
liệu LINQ to SQL.
Có một vài bạn đã hỏi tui khi viết các bài này là “Liệu tui có thể kiểm soát hoàn toàn các
câu SQL được dùng bởi LINQ to SQL mà không cần viết các SPROC?”. Trong bài
viết này tui sẽ nói về điều này – và thảo luận cách bạn có thể viết các câu SQL tùy biến
để truy vấn, cũng như để thêm, sửa hay xóa dữ liệu.
Dùng các biểu thức truy vấn LINQ với LINQ to SQL
Trong bài viết này, chúng ta sẽ dùng mô hình mô hình dữ liệu được tạo với CSDL
Northwind (xin hãy đọc phần 2 để học cách dùng VS 2008 để tạo ra mô hình này):
Trong phần 3, tui đã cho các bạn thấy cách dùng ngôn ngữ LINQ mới được đưa vào VB
và C# để truy vấn mô hình dữ liệu ở trên và trả về một tập đối tượng biểu diễn các
dòng/cột trong CSDL.
Ví dụ, bạn có thể thêm một cách trợ giúp “GetProductsByCategory” vào lớp
DataContext trong mô hình dữ liệu của chúng ta mà nó sẽ dùng một các truy vấn LINQ
để trả về các đối tượng Product từ CSDL:
Một khi bạn đã định nghĩa cách LINQ như trên, bạn có thể viết lệnh giống như
dưới đây để dùng nó lấy về các sản phẩm, và duyệt qua tập kết quả trả về:
Khi biểu thức LINQ bên trong cách “GetProductsByCategory” được thực thi,
trình quản ly LINQ to SQL sẽ tự động thực thi câu SQL động để lấy về dữ liệu Product
và tạo ra danh sách các đối tượng Product. Bạn có thể dùng trình debug để xem cách biểu
thức LINQ này thực thi.
Dùng các câu truy vấn SQL tùy biến với LINQ to SQL
Trong ví dụ mẫu ở trên chúng ta đã không viết bất kỳ câu lệnh SQL nào để truy vấn dữ
liệu và lấy về các đống tượng có kiểu Product. Thay vì vậy, LINQ to SQL sẽ tự đọng
dịch biểu thức LINQ thành câu lệnh SQL chúng ta và thực thi nó trong CSDL.
Nhưng liệu nếu chúng ta muốn kiểm soát hoàn toàn câu lệnh SQL được thực thi với
CSDL, và không muôn LINQ to SQL làm điều đó tự động? Một cách để làm điều này là
dùng một SPROC giống như tui đã trình bày trong bài 6 và bài 7. Một cách khác là dùng
cách “ExcecuteQuery” trong lớp DataContext để thực thi một câu SQL do chúng
ta cung cấp.
Dùng ExecuteQuery
cách ExecuteQuery nhận vào một câu SQL, cùng với một tập các tham số mà ta
có thể dùng để tạo nên câu SQL. Bằng cách dùng nó, bạn có thể thực thi bất kỳ câu lệnh
SQL bạn muốn với CSDL (kể các câu lệnh JOIN nhiều bảng).
Điều làm cho ExecuteQuery thực sự hữu dụng là nó cho phép bạn chỉ ra cách nó trả về
dữ liệu. Bạn có thể làm được điều này bằng cách truyền một đối tượng có kiểu mong
muốn như một tham số của cách, hay dùng kiểu generic.
Ví dụ, bạn có thể thay đổi cách GetProductsByCategory() được tạo ra trước đây –
phiên bản dùng một biểu thức LINQ – để dùng cách ExecuteQuery thực thi một
câu SQL với CSDL và trả về một tập đối tượng Product như kết quả:
Chúng ta có thể gọi GetProductsByCategory() dùng cùng cách như trước đây:
Nhưng không như trước đây, trong trường hợp này câu SQL tùy biến sẽ được gọi thay
cho câu SQL động được tạo bởi biểu thức LINQ.
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:
Mặc nhiên, khi bạn lấy về một mô hình dữ liệu dùng LINQ to SQL, nó sẽ lưu lại các thay
đổi mà bạn làm. Nếu gọi cách “SubmitChanges()” trên lớp DataContext, nó sẽ
lưu lại các thay đổi vào CSDL. tui đã nói chi tiết về vấn đề này trong phần 4 của loạt bài
này.
Một trong nhưng chức năng nổi trọi của ExecuteQuery là nó có thể kết hợp hoàn toàn vào
quá trình theo vết và cập nhật lại mô hình dữ liệu. Ví dụ, bạn có thể viết đoạn lệnh dưới
đây để lấy về tất cả các sản phẩm từ một chủng loại nào đó và giảm giá toàn bộ 10%:
Bởi vì chúng ta đã chỉ ra rõ kiểu trả về của câu lệnh ExecuteQuery trong cách
GetProductsByCategory, do vậy LINQ to SQL sẽ biết cách để dò ra các thay đổi trên các
đối tượng Product mà chúng ta trả về, và khi gọi “SubmitChanges()” trên đối tượng đó,
chúng sẽ được lưu lại trong SCDL.
Tùy biến các biểu thức SQL với các lớp của bạn
cách ExecuteQuery() cho phép bạn chỉ ra bất kỳ lớp nào như kiểu trả về của câu
truy vấn. Lớp này không nhất thiết phải được tạo ra bởi trình 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 cách 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 cách này để truy vấn và duyệt qua tập kết quả trả về:
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 cách 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 sau đó có thể dùng cách 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 cách 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 cách 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:
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
 

Các chủ đề có liên quan khác

Top