hdth07 ltudql02-linq-ep1

12
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

Upload: dung-dinh

Post on 29-Jun-2015

432 views

Category:

Education


3 download

TRANSCRIPT

Page 1: Hdth07 ltudql02-linq-ep1

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

Page 2: Hdth07 ltudql02-linq-ep1

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.

Page 3: Hdth07 ltudql02-linq-ep1

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.

Page 4: Hdth07 ltudql02-linq-ep1

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

Page 5: Hdth07 ltudql02-linq-ep1

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()

Page 6: Hdth07 ltudql02-linq-ep1

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()

Page 7: Hdth07 ltudql02-linq-ep1

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

Page 8: Hdth07 ltudql02-linq-ep1

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

Page 9: Hdth07 ltudql02-linq-ep1

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

Page 10: Hdth07 ltudql02-linq-ep1

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()

Page 11: Hdth07 ltudql02-linq-ep1

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()

Page 12: Hdth07 ltudql02-linq-ep1

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)