5_Truy xuat du lieu voi LINQ

Download Report

Transcript 5_Truy xuat du lieu voi LINQ

Chapter 5
Truy xuất dữ liệu với LINQ
NỘI DUNG
 Biến cục bộ kiểu ngầm định (Implicitly Typed
Local Variables)
 Lớp/Kiểu “tạm thời” (Anonymous types)
 Phương thức mở rộng (Extension Methods)
 Biểu thức Lambda (Lambda Expressions)
 Truy cập dữ liệu với LINQ
BIẾN CỤC BỘ KIỂU NGẦM ĐỊNH
Công dụng:
 Khai báo các biến dùng tạm
 Khai báo biến lưu kết quả trả về của LINQ
(trong những trường hợp ta kg biết trước kiểu dữ liệu
trả về)
Khai báo: dùng từ khóa var
Ví dụ:
var i=32;// sau khi khai báo phải khởi tạo giá trị ngay
var intArr = new[] { 1, 2, 3, 4 };
BIẾN CỤC BỘ KIỂU NGẦM ĐỊNH
Đặc điểm: Strongly Typed Data
• Giá trị khởi tạo phải thuộc một kiểu dữ liệu:
var d = new[] { 1, "one", 2, "two", false } // Error! Mixed types!:
• Không thể gán lại một giá trị không cùng kiểu với giá trị
trước
var s = "This variable can only hold string data!";
s = "This is fine...";// ok
s = 44; // Error!
Không nên lạm dụng var để khai báo biến cục bộ, có thể gây khó hiểu,
nhầm lẫn và khó debug.
;
LỚP/KIỂU TẠM THỜI
Công dụng: cho phép tạo ra các class dùng tạm
thời mà không cần phải định nghĩa class đó trước.
Đặc điểm:
• Không chứa phương thức, sự kiện
• Sử dụng cục bộ trong một ứng dụng
• Tất cả thuộc tính là Readonly, vì vậy sau khi
khởi tạo thì không thể sửa đổi
• Dùng var để khai báo
LỚP/KIỂU TẠM THỜI
Ví dụ:
PHƯƠNG THỨC MỞ RỘNG (Chapter 13 Pro)
Công dụng: cho phép “thêm” phương thức vào
một lớp hiện có mà không cần thừa kế, biên dịch
lại, hoặc sửa đổi mã nguồn gốc.
• Sử dụng phổ biến trong LINQ
Đặc điểm:
 Hàm cần thêm vào phải là hàm static
 Hàm cần thêm vào phải đặt trong một lớp
static
PHƯƠNG THỨC MỞ RỘNG
Đặc điểm:
 Kiểu dữ liệu của tham số đầu tiên sẽ
tương ứng với kiểu dữ liệu cần thêm
vào.
 Từ khoá this phải đặt ở tham số đầu tiên
 Để sử dụng, thì class chứa các phương
thức mở rộng phải visible trong ngữ
cảnh cần sử dụng (dùng using…)
PHƯƠNG THỨC MỞ RỘNG
Ví dụ:
PHƯƠNG THỨC MỞ RỘNG
Khi hai phương thức mở rộng có cùng dấu hiệu
(signature), thì các phương thức phải được gọi
thực hiện theo cách gọi thực hiện một phương
thức static
PHƯƠNG THỨC MỞ RỘNG
Khi hai phương thức mở rộng có cùng dấu hiệu
(signature), thì các phương thức phải được gọi
thực hiện theo cách gọi thực hiện một phương
thức static
BIỂU THỨC LAMBDA
• Là một executable expression
• Có thể chuyển sang expression tree
• Sử dụng thuận lợi hơn phương thức nặc
danh.
• Nơi nào có Delegate và phương thức nặc
danh thì có thể dùng biểu thức Lambda
• Ví dụ:
BIỂU THỨC LAMBDA
Cú pháp:
([parameter list]) => statements;
parameter list: danh sách các tham số truyền vào
(luôn được xem là tham tri)
Ví dụ: In các phần tử của mảng ra màn hình
BIỂU THỨC LAMBDA
Ví dụ: Viết biểu thức tính (x+2)^y
delegate int del(int i, int j);
static del doIt = (x, y) => { x = x + 2;
return Convert.ToInt32(Math.Pow(x, y));};
int j = doIt(5, 2);
Có nghĩa?
doIt thay thế tên hàm  khi gọi
doIt(5,2)
delegate int del1(int i);
static del1 doIt1 = (x) => { ?? Tự viết};
int j = doIt1(5);
• Có thể rút gọn static del1 doIt1 = x vì có 1
tham số.
BIỂU THỨC LAMBDA
Ví dụ: Đoạn code bên dưới làm gì?
BIỂU THỨC LAMBDA
Tập hợp các Fun<> delegate của .Net Framework
Class Library (FCL):
Func<TResult>
Func<T, TResult>
Func<T1, T2, TResult>
Func<T1, T2, T3, TResult>
Func<T1, T2, T3, T4, TResult>
Ý nghĩa các tham số:
T, T1, T2.. : Generic parameter type (Kiểu dữ liệu của các tham số
đầu vào)
TResult: kiểu dữ liệu trả về của delegate
BIỂU THỨC LAMBDA
Ví dụ: Sử dụng Lambda Expression để mã hóa một chuỗi:
BIỂU THỨC LAMBDA
Ví dụ: Sử dụng Lambda Expression để mã hóa một chuỗi:
string cryptText = EncryptString(“IBM”, 1, encryptAlgorithm);
BIỂU THỨC LAMBDA
Biểu thức Lambda có thể sử dụng các
biến cục bộ, tham số của phương thức
đã định nghĩa nó.
TRUY CẬP DỮ LIỆU VỚI LINQ
• Data has become more complex, with an
ever-increasing number of systems and
libraries for accessing those systems.
• Developer must learn how to use a
multitude of libraries to figure out how
to access this data
• We have ADO.NET, which is broken down into
multiple providers (ODBC, OleDB, SQL,
Oracle, and so on)
TRUY CẬP DỮ LIỆU VỚI LINQ
• Truy vấn dữ liệu từ các nguồn dữ liệu
theo mô hình hướng đối tượng bằng
chính ngôn ngữ lập trình (không lệ
thuộc ngôn ngữ của hệ quản trị CSDL)
• Truy vấn dữ liệu các mảng, tập hợp,
XML..
• Các lớp hỗ trợ LINQ thuộc các không
gian tên:System.Linq,
System.Linq.Expressions
TRUY CẬP DỮ LIỆU VỚI LINQ
• Lập trình truy vấn dữ liệu theo phương
pháp truyền thống  tiềm ẩn nhiều lỗi
TRUY CẬP DỮ LIỆU VỚI LINQ
Mục tiêu thiết kế của LINQ:
• Thống nhất cú pháp ngôn ngữ truy vấn
trên các loại dữ liệu (objects, relational
data, XML)
• Truy vấn dữ liệu bằng ngôn ngữ lập trình
• Hạn chế lỗi (phát hiện lỗi ở thời điểm biên
dịch)
TRUY CẬP DỮ LIỆU VỚI LINQ
Mục tiêu thiết kế của LINQ:
• Hổ trợ người lập trình khi viết các câu truy
vấn(IntelliSense support)
• Hỗ trợ gở rối (debug)
• Tương thích hoàn toàn với những công
nghệ khác (standard and generic
collections, data binding, web and
Windows Forms controls)
TRUY CẬP DỮ LIỆU VỚI LINQ
LINQ providers:
TRUY CẬP DỮ LIỆU VỚI LINQ
Các thành phần cơ bản của LINQ:
• Sequences: Các đối tượng đã hiện thực
interface IEnumerable<T> (Array, List..)
• Elements: Các phần tử trong sequence
TRUY CẬP DỮ LIỆU VỚI LINQ
Các thành phần cơ bản của LINQ:
• Query Operators: các phương thức mở rộng
thực hiện các thao tác trên câu lệnh LINQ(trong
System.linq.Enumerable có khoảng 40
operators)
• Query Expression: Ngôn ngữ truy vấn tích
hợp cho phép thực hiện các truy vấn trên dữ
liệu
TRUY CẬP DỮ LIỆU VỚI LINQ
Ví dụ:
• Query Operators:
• Query Expression:
TRUY CẬP DỮ LIỆU VỚI LINQ
Lưu ý: Một số toán tử trong Query Operators
không được hỗ trợ trong Query expression, vì
vậy trong một số trường hợp ta phải gọi trực
tiếp các Query Operators
TRUY CẬP DỮ LIỆU VỚI LINQ
Danh sách các toán tử chuẩn (standard
operators):
TRUY CẬP DỮ LIỆU VỚI LINQ
Danh sách các toán tử chuẩn:
TRUY CẬP DỮ LIỆU VỚI LINQ
Danh sách các toán tử:
LINQ và ĐỐI TƯỢNG (OBJECT)
Cú pháp cơ bản: giống như
SQL, LINQ cũng có các lệnh
from, where, select,
join,
group
by,
và
order by
LINQ và ĐỐI TƯỢNG (OBJECT)
Cú pháp Query Expression:
LINQ và ĐỐI TƯỢNG (OBJECT)
Filter: Where
• Query Operator:
• Query Expression
LINQ và ĐỐI TƯỢNG (OBJECT)
Indexed filtering: Toán tử Where nhận một
tham số thứ 2(optional) kiểu int. Tham số
này cho biết vị trí của phần tử trong
sequense
LINQ và ĐỐI TƯỢNG (OBJECT)
Filter: Contains
LINQ và ĐỐI TƯỢNG (OBJECT)
Filter: Take, Skip
• Take: Lấy n phần tử đầu tiên
• Skip: bỏ n phần tử đầu tiên
LINQ và ĐỐI TƯỢNG (OBJECT)
Filter: TakeWhile, SkipWhile
• TakeWhile: Lấy các phần tử cho đến khi điều
kiện sai
• SkipWhile: bỏ qua phần tử cho đến khi điều
kiện sai thì lấy dữ liệu
LINQ và ĐỐI TƯỢNG (OBJECT)
Distinct: trả về dãy các phần tử lấy từ sequence
sau khi đã bỏ các phần tử trùng
LINQ và ĐỐI TƯỢNG – Data
LINQ và ĐỐI TƯỢNG – ordering
LINQ và ĐỐI TƯỢNG – grouping
LINQ và ĐỐI TƯỢNG – join
LINQ và ĐỐI TƯỢNG – join
LINQ và ĐỐI TƯỢNG – Aggregate Operators
LINQ và ĐỐI TƯỢNG – SelectMany
SelectMany: Nối các dãy con(subsequences) kết quả thành một
dãy (sequence)
Ví dụ: Ta có một mảng Books[], mỗi book gồm có nhiều thuộc
tính (Xem SampleData trong LinqBooks.Common)
LINQ và ĐỐI TƯỢNG – SelectMany
Để lấy danh sách tên các tác giả của các quyển sách:
LINQ và ĐỐI TƯỢNG – SelectMany
Ví dụ:
LINQ và SQL - DataContext
LINQ to SQL: cho phép truy vấn dữ liệu quản
lý bởi SQL SERVER
DataContext: Định nghĩa các thực thể
(Entities), từ đó ta có thể truy vấn dữ liệu.
Các thực thể:
• Ánh xạ đến các bảng quan hệ (Tables)
• Chuyển đổi giữa các câu lệnh LINQ và câu
lệnh SQL để gửi đến CSDL
LINQ và SQL - DataContext
DataContext: là thành phần chính của LINQto-SQL
LINQ và SQL - DataContext
• Để sử dụng Linq to SQL trước hết phải tạo
DataContext.
• DataContext có thể tạo bằng code hoặc sử
dụng tool hỗ trợ bởi Visual Studio (Đọc tài liệu
“C# 3.0 Unleashed” trang 446-448)
LINQ và SQL – Truy vấn dữ liệu với DataContext
• Giả sử ở bước trên ta tạo một DataContext có tên
Hospital thì một lớp có tên HospitalDataContext
được tạo ra. Đồng thời cũng tạo ra 2 class để nắm
dữ 2 thực thể như trong hình.
• Để truy vấn dữ liệu ta phải tạo một instance của lớp
này
LINQ và SQL – Truy vấn dữ liệu với DataContext
• Việc truy vấn dữ liệu thông qua DataContext tương tự như
truy vấn với Collection.
• Thêm mẫu tin:
LINQ và SQL – Truy vấn dữ liệu với DataContext
• Cập nhật dữ liệu.
• Phải gọi thêm hospitalCtx.SubmitChanges()
• Xóa mẫu tin:
• Phải gọi thêm hospitalCtx.SubmitChanges()
LINQ và SQL – Truy vấn dữ liệu với DataContext
• Giả thiết có table xyz(a,b)
hêm 1 objects (add new row)
Cách 1:
var HospitalCTX = new HospitalDataContext();
HospitalCTX.xyzs.InsertOnSubmit(new xyz { a = txtA.Text, b = txtB.Text
;
HospitalCTX.SubmitChanges();
Cách 2:
ar HospitalCTX = new HospitalDataContext();
xyz obj = new xyz();
obj.a = txtA.Text;
obj.b = txtB.Text;
HospitalCTX.xyzs.InsertOnSubmit(obj);
HospitalCTX.SubmitChanges();
LINQ và SQL – Truy vấn dữ liệu với DataContext
• Giả thiết có table xyz(a,b)
óa 1 objects (delete 1 row)
Cách 1:
HospitalDataContext HospitalCTX = new HospitalDataContext();
IQueryable<xyz > xyzdelete= from mm in HospitalCTX.xyzs where mm.a
=txtA.Text
select mm;
HospitalCTX.xyzs.DeleteOnSubmit(xyzdelete.First());
HospitalCTX.SubmitChanges();
Cách 2:
ar HospitalCTX = new HospitalDataContext();
xyz obj = HospitalCTX.xyzs.Where(mm => mm.a ==
xtA.Text).FirstOrDefault();
HospitalCTX.xyzs.DeleteOnSubmit(obj);
HospitalCTX.SubmitChanges();
LINQ và SQL – Truy vấn dữ liệu với DataContext
• Giả thiết có table xyz(a,b)
ửa 1 objects (edit 1 row)
Cách 1:
HospitalDataContext HospitalCTX = new HospitalDataContext();
IQueryable<xyz > xyzUpdate= from mm in HospitalCTX.xyzs where
mm.a ==txtA.Text
select mm;
xyzUpdate.First().b =txtB.Text ;
HospitalCTX.SubmitChanges();
Cách 2:
var HospitalCTX = new HospitalDataContext();
xyz obj = HospitalCTX.xyzs.Where(nn => nn.a ==
xtA.Text).FirstOrDefault();
obj.b = txtB.Text;
HospitalCTX.SubmitChanges();
LINQ và SQL – Truy vấn dữ liệu với DataContext
Tạo StoreProcedure trong SQL
CREATE PROCEDURE
GetDoctors
AS
select Name
from HospitalStaff
where Position = ‘Doctor’
CREATE PROCEDURE InsertStaff
(
@Name varchar(50),
@Position varchar(50)
)
AS
insert into HospitalStaff
(Name, Position)
values (@Name, @Position)
LINQ và SQL – Truy vấn dữ liệu với DataContext
Tạo function trong SQL
CREATE FUNCTION Doctors()
RETURNS TABLE
AS
RETURN
select * from hospitalstaff
where Position = ‘Doctor’
CREATE FUNCTION
Doctors(@pos varchar(10))
RETURNS TABLE
AS
RETURN
select * from hospitalstaff
where Position = @pos
LINQ và SQL – Truy vấn dữ liệu với DataContext
Gọi StoreProcedure, Function: để dùng StoreProcedure,
Function ta phải drag and drop các procedure này vào
DataContext
• Gọi Function:
• Gọi StoreProcedure
LINQ và ADO.NET ENTITIES
ADO.NET:
• Công nghệ dùng để kết nối tới các CSDL (nhiều loại DL khác
nhau)
• Thêm, cập nhật, xóa, truy vấn dữ liệu
• Hỗ trợ cả 2 mô hình connected và disconnected
LINQ và ADO.NET ENTITIES
Kiến trúc ADO.NET
LINQ và ADO.NET ENTITIES
ADO.NET Data Providers: Thư viện cung cấp các phương tiện
để kết nối, truy xuất đến các nguồn dữ liệu khác nhau
LINQ và ADO.NET ENTITIES
Các thành phần chính của ADO.NET:
Objects
Công dụng
Connection
Thiết lập kết nối tới CSDL
Command
Thực hiện các câu lệnh SQL
DataReader
Nhận kết quả trả về khi thực hiện command có chứa
câu lệnh Select.
Cho phép duyệt qua các mẫu tin nhanh(duyệt một
chiều, không cho phép cập nhật dữ liệu)
DataSet
Chứa một hoặc nhiều DataTable. Dữ liệu của
DataSet chứa trong bộ nhớ(hổ trợ mô hình
disconnected). Có thể cập nhật dữ liệu trong DataSet
DataAdapter
Cập nhật dữ liệu từ các DataTable xuống CSDL
LINQ và ADO.NET ENTITIES
ADO.NET Entity Framework:Cung cấp một phương thức mới để
sử dụng ADO.NET
LINQ và ADO.NET ENTITIES
Entity Data Model:
• Conceptual model định nghĩa:
 Các entity dùng trong ứng dụng
 Quan hệ giữa các entity
• Storage model định nghĩa
• Cấu trúc của các đối tượng trong Database
LINQ và ADO.NET ENTITIES
Entity Framework:
• Chuyển câu lệnh LINQ thành câu lệnh truy vấn
tương ứng theo ngôn ngữ của Database
• Chuyển các đối tượng trả về của câu truy vấn
thành các entity tương ứng
LINQ và ADO.NET ENTITIES
Với ADO.NET Entity Framework:
• Người lập trình hoàn toàn có thể xây dựng chương trình theo
mô hình hướng đối tượng mà không lệ thuộc vào các table có
trong database
• Mỗi Entity trong mô hình có thể đại diện:một table, một phần
table, nhiều table
• Mỗi Entity có một hoặc nhiều thuộc tính
LINQ và ADO.NET ENTITIES
Sử dụng Entity Data Model Wizard (xem hướng dẫn trong
file “Use the Entity Data Model Wizard” hoặc trang 577
Murach_ADO_NET_3_5_LINQ)
• Sau khi tạo xong file EDMX (ví dụ hospital.edmx) VS2008
tạo lớp HospitalEntities. Ta dùng đối tượng của lớp này
để truy xuất dữ liệu thông qua các entity
LINQ và ADO.NET ENTITIES
• Lấy dữ liệu:
LINQ và ADO.NET ENTITIES
• Lấy dữ liệu:
LINQ và ADO.NET ENTITIES
• Lấy dữ liệu:
LINQ và ADO.NET ENTITIES
• Thêm dữ liệu:
LINQ và ADO.NET ENTITIES
• Cập nhật dữ liệu:
LINQ và ADO.NET ENTITIES
• Xóadữ liệu: