hdth07 ltudql02-linq-ep1
TRANSCRIPT
Lập trình ứng dụng quản lý 2
Ngôn ngữ truy vấn LINQ
Ngô Ngọc Đăng Khoa
2011, April 12
1 LTUDQL2 – TUT03
1 Mục tiêu & Yêu cầu
1.1 Mục tiêu
Nắm được phương pháp sử dụng ngôn ngữ truy vấn LINQ trong VB.NET
3.5 để truy vấn các đối tượng dữ liệu trên bộ nhớ & CSDL bằng cả 2
phương thức truy vấn Query Expression & Lambda Expression
Sử dụng công cụ LINQPad để kiểm thử kết quả truy vấn
1.2 Yêu cầu
Đọc kỹ & thực hiện các bước theo tutorial
1.3 Lưu ý
Do mặc định LINQ chỉ hỗ trợ hệ quản trị CSDL SQL Server nên sinh viên
cần cài đặt SQL Server 2005 Express vào máy để có thể thực hiện được các
hướng dẫn bên dưới
Các phòng máy trong trường đa phần đã cài sẵn SQL Server 2005
Express (đi kèm với Visual Studio 2008) nên sinh viên không cần cài
đặt tool này nhưng phải cài đặt SQL Server Management Studio
2005 Express vào để tạo được CSDL.
2 Download & Setup
2.1 LINQPad
Sinh viên download công cụ LINQPad miễn phí cho .NET Framework 3.5 tại
http://www.linqpad.net/
2.2 SQL Server 2005 Express
Cần cài đặt 2 công cụ:
Microsoft SQL Server 2005 Express Edition Service Pack 3
(http://www.microsoft.com/downloads/en/details.aspx?FamilyID=31818
42A-4090-4431-ACDD-9A1C832E65A6). Các phòng máy trong trường
đã có sẵn nên không cần cài đặt.
Microsoft SQL Server Management Studio Express Service Pack 3
(http://www.microsoft.com/downloads/en/details.aspx?FamilyID=5d762
30d-580d-4874-8c7d-93491a29db15). Công cụ này bắt buộc phải cài.
2 LTUDQL2 – TUT03
2.3 Khởi động service SQL Server (SQLEXPRESS)
Start > Run > services.msc
Tìm SQL Server (SQLEXPRESS)
Nếu Status == Started nghĩa là service đang hoạt động, ngược lại ta
cần khởi động service SQLEXPRESS.
Click phải service SQLEXPRESS > Properties > tab Logon > check Local
System account > OK
Click phải service SQLEXPRESS > Start. Cần đảm bảo sau khi Start thì
status của service SQLEXPRESS phải là Started.
3 LTUDQL2 – TUT03
2.4 SQL Server Management Studio 2005 Express SP3
Cài đặt SQL Server Management Studio 2005 Express SP3
Khởi động SQL Server Management Studio 2005 Express SP3 & thực hiện
kết nối vào CSQL SQL Server Express 2005
Cần đảm bảo service SQLEXPRESS đang có status là Started
Nhập thông tin kết nối như hình dưới
4 LTUDQL2 – TUT03
3 Bài tập truy vấn
LINQ cho phép truy vấn trên nguồn dữ liệu có dạng dãy như mảng,
ArrayList, List<> & các đối tượng được cài đặt theo interface IEmumerable<>
hoặc IQueryable<>. Trước khi truy vấn ta cần chuẩn bị sẵn nguồn dữ liệu thoả
các dạng nguồn dữ liệu nêu trên.
Các ví dụ dưới đây được thực hiện trên LINQPad với Language là VB
Statement(s)
3.1 Các ví dụ không cần CSDL
3.1.1 Cho biết danh sách các số nguyên nhỏ hơn 5 trong danh sách số
nguyên cho trước
Dim list As Integer() = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} Dim query = From n In list Where n <= 5 Select n query.Dump()
Lệnh query.Dump() là lệnh riêng của LINQPad, mục đích là show kết quả câu
truy vấn ra màn hình. Lệnh này KHÔNG tồn tại trong VB.NET.
3.1.2 Hãy cho biết danh sách các số nguyên chẵn trong dãy cho trước
Dim numbers as Integer() = { 3, 9, 100, 4, 2, 6, 7, 1, 8 } Dim query = From n In numbers Where n Mod 2 = 0 Select n query.Dump()
3.1.3 Hãy cho biết danh sách các số nguyên có CHỈ SỐ chẵn trong dãy cho
trước
Dim numbers as Integer() = { 3, 9, 100, 4, 2, 6, 7, 1, 8 } Dim query = numbers _ .Select(Function(n, idx) New With {.Idx = idx, .N = n}) _ .Where(Function(item) item.Idx Mod 2 = 0) query.Dump()
5 LTUDQL2 – TUT03
3.1.4 Hãy cho biết câu truy vấn có tác dụng nghịch đảo thứ tự TỪ của 1 câu
cho trước
Ví dụ: "the quick brown fox jumps over the lazy dog" => “dog lazy the over jumps
fox brown quick the”
Dim sentence as String = "the quick brown fox jumps over the lazy dog" Dim words as String() = sentence.Split(" ") Dim reversed as String = words.Aggregate( Function(workingSentence, nextWord) nextWord & " " & workingSentence ) Console.WriteLine(reversed)
3.1.5 Cho dãy từ 1->9. Hãy cho biết câu truy vấn LINQ cho ra kết quả gồm 3
cột: cột 1 chứa các số trong dãy gốc lớn hơn 3 & nhỏ hơn 8, cột 2 là
dãy từ 1->3, cột 3 là double của cột 1 * cột 2
Dim list as Integer() = { 1, 2, 3, 4, 5, 6, 7, 8, 9 } Dim query = From n in list _ Where n > 3 And n < 8 _ Let newList = {1, 2, 3} _ From m in newList _ Select New With { .Left = n, .Middle = m, .Right = n*2*m }
query.Dump()
6 LTUDQL2 – TUT03
3.1.6 Hãy cho biết câu truy vấn LINQ cho phép lấy thông tin các khách hàng
ở thành phố Mexico D.F. biết rằng mỗi khách hàng có 3 thông tin: ID,
Tên & Thành phố & thông tin khách hàng cần lấy là Thành Phố & Tên
(không cần ID)
(Ví dụ này cần khai báo class Customer riêng nên language sẽ là VB Program)
Khai báo class Customer
Public Class Customer Private _customerID As String Public Property CustomerID() As String Get Return _customerID End Get Set(ByVal value As String) _customerID = value End Set End Property Private _contactName As String Public Property ContactName() As String Get Return _contactName End Get Set(ByVal value As String) _contactName = value End Set End Property Private _city As String Public Property City() As String Get Return _city End Get Set(ByVal value As String) _city = value End Set End Property End Class
7 LTUDQL2 – TUT03
Xây dựng hàm tạo danh sách khách hàng phục vụ cho truy vấn
Shared Function GetCustomers() as Customer() Dim ds = { _ new Customer() With { .CustomerID = "ALFKI", .ContactName = "Maria Anders", .City = "Berlin" }, _ new Customer() With { .CustomerID = "ANATR", .ContactName = "Ana Trujillo", .City = "Mexico D.F." }, _ new Customer() With { .CustomerID = "ANTON", .ContactName = "Antonino Moreno", .City = "Mexico D.F." } _ } Return ds End Function
Truy vấn LINQ
Sub Main Dim query = From c in GetCustomers() _ Where c.City = “Mexico D.F.” _ Select c.City, c.ContactName query.Dump() End Sub
3.1.7 Như câu trên nhưng điều kiện truy vấn là các khách hàng có ID bắt
đầu bởi AL
Sub Main Dim query = From c in GetCustomers() _ Where c.CustomerID LIKE "AL*" _ Select New With { _ .City = c.City, _ .ContactName = c.ContactName _ } query.Dump() End Sub
8 LTUDQL2 – TUT03
3.2 Các ví dụ dùng CSDL Northwind
3.2.1 Cài đặt CSDL Northwind
Download script CSDL Northwind (@ moodle)
Khởi động SQL Server Management Studio Express & nhập thông tin
kết nối theo hướng dẫn ở mục [2.4]
File > Open > File > chọn Northwind.sql
Query > Execute
Sau khi cài đặt, cần đảm bảo CSDL Northwind tồn tại trong danh sách các
database đang có
3.2.2 Kết nối LINQPad vào CSDL Northwind
Bước 1: click chọn Add Connection tại màn hình chính LINQPad
Bước 2: chọn Build data context automatically > Next
9 LTUDQL2 – TUT03
Bước 3: nhập thông tin kết nối như hình dưới > OK
3.2.3 Hãy cho biết danh sách sản phẩm có tên danh mục là “Beverages”
Dim query = From p in Products _ Where p.Category.CategoryName = "Beverages" _ Select New With { p.ProductName, p.UnitPrice, p.Category.CategoryName } query.Dump()
10 LTUDQL2 – TUT03
3.2.4 Hãy cho biết {Mã SP, Tên SP, Giá SP} theo thứ tự giảm dần theo Tên SP
& Giá SP
Query Expression
Dim query = From p In Products _ Order By p.ProductName, p.UnitPrice Descending _ Select p.ProductID, p.ProductName, p.UnitPrice query.Dump()
Lambda Expression
Dim query = Products _ .OrderBy(Function(p) p.ProductName) _ .ThenByDescending(Function(p) p.UnitPrice) _ .Select(Function(p) New With {p.ProductID, p.ProductName, p.UnitPrice}) query.Dump()
3.2.5 Hãy cho biết số lượng sản phẩm trong từng danh mục
Query Expression
Dim query = From p In Products _ Group p By Key = p.Category.CategoryName _ Into Group Select TenDanhMuc = Key, SoLuong = Group.Count() query.Dump()
Lambda Expression
Dim query = Products.GroupBy(Function(p) p.Category.CategoryName) _ .Select(Function(grpRow) New With { .TenDanhMuc = grpRow.Key, .SoLuong = grpRow.Count() } ) query.Dump()
11 LTUDQL2 – TUT03
4 Bài tập về nhà
Tìm hiểu các lệnh sau trong LINQ (ngôn ngữ VB.NET)
Join, GroupJoin
SelectMany
Any, All
Take, Skip, TakeWhile, SkipWhile
First, Single, ElementAt()
DefaultIfEmpty
Concat, Union, Distinct, Intersect, Except
Count, Min, Max, Average, Sum
OfType
Thực hiện lại các bài tập CSDL với truy vấn LINQ
Thực hiện câu truy vấn sau: Hãy cho biết danh sách các phi công có thể lái
tất cả các máy bay, biết CSDL như sau
PhiCong(MaPC, TenPC)
MayBay(MaMB, TenMB)
KhaNang(MaPC, MaMB)