76
Chapter 5 Truy xuất dữ liệu với LINQ

Chapter 5

Embed Size (px)

DESCRIPTION

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. - PowerPoint PPT Presentation

Citation preview

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 varVí 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ướcvar s = "This variable can only hold string data!";s = "This is fine...";// oks = 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ọidoIt(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 LINQ-to-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)

Thê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:var 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)

Xó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:var HospitalCTX = new HospitalDataContext(); xyz obj = HospitalCTX.xyzs.Where(mm => mm.a == txtA.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)

Sử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 == txtA.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 GetDoctorsASselect Namefrom HospitalStaffwhere Position = ‘Doctor’

CREATE PROCEDURE InsertStaff(@Name varchar(50),@Position varchar(50))ASinsert 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 TABLEASRETURNselect * from hospitalstaffwhere Position = ‘Doctor’

CREATE FUNCTION Doctors(@pos varchar(10))RETURNS TABLEASRETURNselect * from hospitalstaffwhere 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: