Upload
meredith-anchoret
View
39
Download
2
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
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
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
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
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:
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
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
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
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)
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: 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 – 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à 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
• Để 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
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
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