Tony Patton
O/R Designer
LINQ và Visual Studio 2008 IDE khiến cho việc lấy dữ liệu trở nên khá dễ dàng từ một cơ sở dữ liệu SQL Server. Visual Studio bao gồm một mục khung mẫu có tên gọi LINQ to SQL Classes mà bạn có thể thêm vào trong dự án. Một tài nguyên dbml được tạo ra khi bạn thêm vào kiểu mục này với một tên mặc định (mà bạn có thể thay đổi) của DataClasses1.dbml.
Khi mục đó được bổ sung thì ô O/R Designer sẽ được mở ra bên trong Visual Studio. Điều này sẽ cho phép bạn kéo và thả các mục cơ sở dữ liệu (bảng, xem, thủ tục lưu trữ) tới O/R Designer. O/R Designer tạo ra tập tin dbml, tập tin này sẽ cung cấp kết nối giữa các lớp LINQ to SQL Classes và các đối tượng cơ sở dữ liệu. O/R Designer đồng thời cũng tạo ra DataContext và các lớp thực thể.
Có hai khu vực chính bên trong O/R Designer là Entities và Methods. Khu vực chính của cùng thiết kế dành cho các thực thể như Tables và Viewa, cùng với sự phân cấp và mọi thứ có liên quan. Ô Methods bao gồm các thủ tục và chức năng được lưu trữ đã được nối kết tới các phương pháp của lớp DataContext. O/R Designer hiện thời hỗ trợ SQL Server 2000, SQL Server 2005 và SQL Express Edition.
Trước đi đi sâu vào xem xét ví dụ, chúng ta hãy cùng tìm hiểu kĩ hơn về truy vấn LINQ.
Truy vấn
Bạn cần thực hiện ba bước để truy nhập dữ liệu thông qua LINQ: Thu thập nguồn dữ liệu, tạo các truy vấn và thực hiện truy vấn. Một truy vấn được dùng để định nghĩa xem dữ liệu nào đã được khôi phục từ nguồn dữ liệu. Ngoài ra, bạn có thể thao tác dữ liệu thông qua việc sắp xếp, nhóm và những thứ tương tự. Một truy vấn được lưu trữ trong một biến truy vấn và được khởi tạo với một biểu thức truy vấn.
Truy vấn có những cú pháp riêng, những cú pháp này mạnh giống với chuẩn SQL. Một biểu thức truy vấn có ba mệnh đề: from, where và select. Mệnh đề form định nghĩa nguồn dữ liệu; Mệnh đề select định nghĩa những cái quay trở lại; Và mệnh đề where (không bắt buộc) giúp bạn làm rõ hơn một tìm kiếm bao gồm chỉ các dữ liệu phù hợp với tiêu chuẩn nhất định.
Truy vấn sẽ không được thực hiện cho đến khi nó đã được truy nhập; Điều này giống như là hoãn lại quá trình thực hiện. Ví dụ tiếp theo sẽ cung cấp nhanh việc sử dụng truy vấn.
Ví dụ
Tạo một dự án trang web bao gồm một mục LINQ to SQL Classes, mục này kết nối tới cơ sở dữ liệu chuẩn Northwind trên SQL Server 2000. Một thực thể được tạo ra cho bảng Customers. O/R Designer tạo ra tập tin dbml đặt tên là DataClasses1.dbml.
Khi lớp DataContext được tạo ra trên bảng và thủ tục lưu trữ trên cơ sở dữ liệu Northwind, bạn có thể sử dụng lớp này trong đoạn mã khác. Khi sử dụng lớp DataContext được tạo, nó phải bao gồm tên với DataContext được bổ sung vào sau. Trong ví dụ này bạn phải sử dụng tên DataClasses1DataContext. (Visual Studio IntelliSense hỗ trợ đầy đủ LINQ và tất cả các lớp của nó, vì vậy bạn có thể dễ dàng tránh được lỗi cho gõ phím).
Tôi sử dụng ASP.NET WEB Form trong ví dụ sau:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="LINQTest._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>LINQ Example</title></head>
<body>
<form id="frmLINQTest" runat="server">
<div>
<asp:GridView ID="gvCustomers" runat="server"></asp:GridView>
</div></form></body></html>
Web Form có chứa một trường hợp của điều khiển GridView; Điều khiển này hiển thị dữ liệu thông qua LINQ. Đoạn mã được đặt bên trong sự kiện Page_Load, vì vậy dữ liệu sẽ được tải vào khi bạn mở trang web.
Bước đầu tiên bạn sẽ tạo ra một thể hiện của lớp DataContext. Điều này sẽ cung cấp sự truy nhập cơ sở dữ liệu, vì vậy bạn có thể truy nhập vào bảng của nó như một thuộc tính của lớp DataContext. Ngay khi lớp DataContext được tạo ra thì bạn có thể lấy dữ liệu từ đây thông qua một truy vấn.
Đoạn mã bao gồm một truy vấn kéo mọi bản ghi dữ liệu và các cột từ bảng Customers. Dữ liệu được sắp xếp bởi cột thứ hai và truy vấn được thực hiện khi nó tác động lên điều khiển GridView trên trang.
protected void Page_Load(object sender, EventArgs e) {
DataClasses1DataContext db = new DataClasses1DataContext();
var customers = from p in db.Customers
orderby 1
select p;
gvCustomers.DataSource = customers;
gvCustomers.DataBind();
}
Đây là đoạn mã tương ứng trên Visual Basic:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim db As DataClasses1DataContext = New DataClasses1DataContext()
Dim customers As Object
customers = From p In db.Customers Order By 1 Select p
gvCustomers.DataSource = customers
gvCustomers.DataBind()
End Sub
Khi tải trang web, mọi dữ liệu từ bảng Customers sẽ được hiển thị trên điều khiển GridView.
Như trong ví dụ thì bạn có thể dễ dàng gọi thủ tục lưu trữ trên SQL Server như là một phương pháp của đối tượng DataContext. Những kết quả của phương pháp này - thủ tục lưu trữ - có thể được dùng chứa một điều khiển dữ liệu tương tự như điều khiển mà trước đó sử dụng GridView, như trong đoạn mã tiếp theo sau đây:
protected void Page_Load(object sender, EventArgs e) {
DataClasses1DataContext db = new DataClasses1DataContext();
var top_customers = db.Ten_Most_Expensive_Products();
gvCustomers.DataSource = top_customers;
gvCustomers.DataBind();
}
Đây là đoạn mã tương ứng trên Visual Basic:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim db As DataClasses1DataContext = New DataClasses1DataContext()
Dim customers As Object
customers = db.Ten_Most_Expensive_Products()
gvCustomers.DataSource = customers
gvCustomers.DataBind()
End Sub
Những ví dụ đơn giản này đã biểu thị cú pháp truy vấn và cách sử dụng O/R Designer như thế nào trên Visual Studio 2008. LINQ cho phép bạn thao tác cập nhật, xóa, thêm (update, delete, add) và đọc dữ liệu.