xomxixon

New Member

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





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.
1. 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ư tôi đã 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.



Để 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:

LINQ to SQL Tutorial
85
Bước cuối cùng là cấu hình lại để lớp truy cập dữ liệu dùng thủ tục SPROC khi chèn các đối tượng
Order mới vào trong CSDL. Chúng ta có thể là điều này bằng cách chọn lớp Order trong cửa sooe
LINQ to SQL designer, và sau đó chuyển đến bảng thuộc tính và nhấn nút 3 chấm (...) ở mục Insert
để chọn thao tác tương ứng:
Khi nhấn nút này, cửa sổ sau sẽ hiện ra để có thể tùy biến hành vi Insert:
LINQ to SQL Tutorial
86
Ở trên, nếu bạn chọn chế độ mặc nhiên ("Use Runtime") thì LINQ to SQL sẽ tính toán và sinh ra câu
lệnh SQL động để thực hiện các thao tác tương ứng. Chúng ta có thể thay đổi bằng cách nhấn chuột
vào Customize và chọn thủ tục InsertOrder từ danh sách các SPROC:
LINQ to SQL sẽ hiển thị các tham số của thủ tục mà ta đã chọn, và cho phép ánh xạ các thuộc tính
của lớp Order và các tham số của InsertOrder. Mặc nhiên, LINQ to cũng tự động xác định các tham
số tương ứng theo tên, tuy nhiên bạn vẫn có thể sửa lại nếu muốn.
LINQ to SQL Tutorial
87
Nhấn vào nút Ok là xong. Giờ đây bất cứ khi nào một đối tượng Order được thêm vào DataContext
và cách SubmitChanges() được gọi, thủ tục InsertOrder sẽ được thực thi thay cho câu lệnh
SQL động.
Quan trọng: Mặc dù hiện tại chúng ta đã dùng SPROC để cập nhật, cách "OnValidate" của
Order mà chúng ta đã tạo trước đây (trong bước 1 của bài viết này) để kiểm tra tính hợp lệ của đối
tượng Order sẽ vẫn được thực thi trước khi bất kỳ thay đổi nào được thực hiện. Do vậy chúng ta sẽ
có một cách rõ ràng để xử lý và kiểm tra các quy tắc, và có thể dùng lại một cách dễ dàng mà không
phụ thuộc vào việc chúng ta dùng SQL động hay dùng SPROC.
14. Bước 4: Thực hiện cập nhật dùng SPROC
Giờ chúng ta sẽ sửa lại đối tượng Customer để cho phép cập nhật bằng cách dùng SPROC.
Chúng ta sẽ bắt đầu bằng cách tạo một SPROC tên "UpdateCustomer" như dưới đây:
Chú ý ở trên, ngoài việc truyền giá trị cho tham số CustomerID, tui cũng truyền một tham số khác có
tên @Original_CustomerID. Cột CustomerID trong bảng Customers không phải là một cột tự tăng,
và nó có thể được chỉnh sửa như một phần của thao tác cập nhật. Do vậy chúng ta sẽ phải truyền cả
giá trị của CustomerID cũ và CustomerID mới để có thể cập nhật. Chúng ta sẽ xem cách ánh xạ các
cột ngay sau đây.
Bạn sẽ thấy ở trên tui đã truyền một tham số có tên @Version (có kiểu timestamp) vào cho SPROC.
Đây là một cột tui đã thêm vào bảng Customers để có thể xử lý việc tranh chấp khi các thao tác cập
nhật được diễn ra đồng thời (optimistic concurrency). tui sẽ nói chi tiết hơn về việc xử lý tranh chấp
này trong bài viết sau của loạt bài LINQ to SQL, nhưng tui cũng nói luôn là LINQ to SQL hỗ trợ đầy
đủ optimistic concurrency, và cho phép bạn có thể chọn dùng phiên bản timestamp hay bằng cách cung
cấp cả giá trị cũ/mới cho SPROC để có thể xác định được các thay đổi được tạo ra bới người khác kể
từ lần cuối bạn đọc dữ liệu. Trong ví dụ này tui dùng timestamp vì nó giúp viết lệnh rõ ràng hơn.
Một khi đã tạo xong SPROC, bạn có thể kéo/thả nó vào cửa sổ LINQ to SQL designer để thêm nó
như một cách trong lớp DataContext. Chúng ta có thể chọn lớp Customer trong cửa sổ thiết
LINQ to SQL Tutorial
88
kế và nhấn vào nút ... ở mục Update để dùng SPROC vừa tạo trong việc cập nhật lại dữ liệu trong
bảng Customer:
Chúng ta sẽ chọn ô "Customize" và chọn để dùng UpdateCustomer:
Khi ánh xạ các thuộc tính của đối tượng Customer vào các tham số của SPROC, bạn sẽ được nhắc
rằng bạn đang muốn gán các giá trị mới(Current) hay các giá trị gốc (Original) - là các giá trị mà bạn
lấy về lần đầu từ CSDL. Ví dụ, bạn sẽ cần gán giá trị thuộc tính Customer.CustomerID "mới" vào
LINQ to SQL Tutorial
89
cho tham số @CustomerID của SPROC, và Customer.CustomerID "gốc" vào cho
@original_customerID.
Khi nhấn "Ok" trên ửa sổ này, bạn đã hoàn thành việc ánh xạ các tham số vào các thuộc tính. Từ giờ
trở đi, mỗi khi cập nhật lại giá trị cho đối tượng Customer và gọi SubmitChanges(), thủ tục
UpdateCustomer sẽ được gọi thay cho câu lệnh SQL động.
Quan trọng: Dù rằng hiện tại bạn đã dùng SPROC để cập nhật, cách "OnPhoneChanging()"
mà chúng ta đã tạo trước đó (trong bước 1 của bài này) để xác thực số điện thoại vẫn được thực thi
trước khi bất kỳ thay đổi nào được lưu lại hay "UpdateCustomer" được gọi. Chúng ta có một cách rõ
ràng, sáng sủa để hiện thực hóa cá quy tắc xử lý cũng như xác thực dữ liệu, và có thể dùng chúng mà
không phụ thuộc và việc chúng ta đang dùng câu lệnh SQL động hay SPROC.
15. Bước 5: Dùng lớp DAL lần nữa
Một khi đã cập nhật lớp truy cạp dữ liệu (DAL) để dùng SPROC thay vì câu lệnh SQL động, bạn có
thể chạy lại các câu lệnh tương tự các câu lệnh ta đã làm ở bước 2 để làm việc với các lớp mô hình
dữ liệu:
Giờ đây việc cập nhật đối tượng Customer, và việc thêm các đối tượng Order sẽ được thực thi thông
qua thủ tục đã tạo thay vì dùng các câu SQL động. Các quy tắc kiểm tra cũng được thực thi hệt như
trước đây, và các câu lệnh chúng ta đã dùng để sử dụng các lớp mô hình dữ liệu cũng hoàn toàn
tương tự.
16. Một số ưu điểm của việc dùng SPROC
Sau đây là một vài ý nhỏ có thể có ích cho bạn trong việc dùng SPROC:
Dùng các tham số dạng output:
Trong phần 3 ở trên, tui đã biểu diễn cách chúng ta có thể trả về giá trị OrderID mới được tạo (đây là
một cột tự tăng trong CSDL) bằng cách dùng một tham số dạng output. Bạn sẽ không bị giới hạn
trong việc trả về chỉ các cột tự tăng - mà thật sự bạn có thể trarveef các giá trị cho bất kỳ tham số nào
LINQ to SQL Tutorial
90
của SPROC. Bạn có thể dùng cách tiếp cận này cho cả trường hợp Insert và Update. LINQ to
SQL có thể lấy giá trị trả về và dùng nó để cập nhật giá trị của các thuộc tính của các đối tượng trong
mô hình dữ liệu mà không cần thực thi thêm một câu truy vấn thứ 2 để lấy các giá trị đã được tạo ra.
Sẽ thế nào nếu một SPROC phát ra một lỗi?
Nếu một SPROC phát ra một lỗi khi thực hiện việc Insert/Update/Delete, LINQ to SQL sẽ tự động
hủy và rollback toàn bộ các thay đổi đã tạo ra trong transaction kết hợp với lời gọi SubmitChanges().
Điều này đảm bảo rằng dữ liệu của bạn sẽ luôn trong trạng thái đúng đắn.
tui có thể viết code thay vì dung ORM designer để gọi SPROC?
Như đã nói trong phần đầu bài viết này, bạn có thể dùng LINQ to SQL designer để ánh xạ các thao
tác thêm/sửa/xóa vào các SPROC, hay bạn cũng có thể thêm các cách partial vào lớp
DataContext và viết lệnh gọi chúng. Đây là một ví dụ về cách viết các cách trong lớp partial
của NorthwindDataContext dùng UpdateCustomer để gọi một thủ tục:
Đoạn lệnh ở trên thực ra chính là cái được tạo ra khi bạn dùng LINQ to SQL designer để ánh xạ
SPROC và kết hợp nó với thao tác cập nhật đối tượng Customer. Bạn có thể xem nó như điểm khởi
đầu và sau đó tiếp tục thêm bất kỳ lệnh xử lý nào bạn muốn (ví dụ: dùng giá trị trả về của SPROC để
phát ra các exception tươ...
 

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

Top