760 likes | 911 Views
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.
E N D
Chapter 5 Truyxuấtdữliệuvới LINQ
NỘI DUNG • Biếncụcbộkiểungầmđịnh (Implicitly Typed Local Variables) • Lớp/Kiểu “tạmthời” (Anonymous types) • Phươngthứcmởrộng (Extension Methods) • Biểuthức Lambda (Lambda Expressions) • Truycậpdữliệuvới LINQ
BIẾN CỤC BỘ KIỂU NGẦM ĐỊNH • Côngdụng: • Khaibáocácbiếndùngtạm • Khaibáobiếnlưukếtquảtrảvềcủa LINQ (trongnhữngtrườnghợpta kg biếttrướckiểudữliệutrảvề) • Khaibáo: dùngtừkhóavar • Vídụ: • vari=32;// saukhikhaibáophảikhởitạogiátrịngay • varintArr = new[] { 1, 2, 3, 4 };
BIẾN CỤC BỘ KIỂU NGẦM ĐỊNH • Đặcđiểm: Strongly Typed Data • Giátrịkhởitạophảithuộcmộtkiểudữliệu: • var d = new[] { 1, "one", 2, "two", false } // Error! Mixed types!: • Khôngthểgánlạimộtgiátrịkhôngcùngkiểuvớigiátrịtrước • var s = "This variable can only hold string data!"; • s = "This is fine...";// ok • s = 44; // Error! • Khôngnênlạmdụngvarđểkhaibáobiếncụcbộ, cóthểgâykhóhiểu, nhầmlẫnvàkhó debug. • ;
LỚP/KIỂU TẠM THỜI • Côngdụng: chophéptạoracác class dùngtạmthờimàkhôngcầnphảiđịnhnghĩa class đótrước. • Đặcđiểm: • Khôngchứaphươngthức, sựkiện • Sửdụngcụcbộtrongmộtứngdụng • TấtcảthuộctínhlàReadonly, vìvậysaukhikhởitạothìkhôngthểsửađổi • Dùngvarđểkhaibáo
LỚP/KIỂU TẠM THỜI • Vídụ:
PHƯƠNG THỨC MỞ RỘNG (Chapter 13 Pro) • Côngdụng: cho phép “thêm” phươngthứcvà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ụngphổbiếntrong 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ộtlớpstatic
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ứacácphươngthứcmởrộngphả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 • Khihaiphươngthứcmởrộngcócùngdấuhiệu (signature), thìcácphươngthứcphảiđượcgọithựchiệntheocáchgọithựchiệnmộtphươngthức static
PHƯƠNG THỨC MỞ RỘNG • Khihaiphươngthứcmởrộngcócùngdấuhiệu (signature), thìcácphươngthứcphảiđượcgọithựchiệntheocáchgọithựchiệnmộtphươngthức static
BIỂU THỨC LAMBDA • Làmột executable expression • Cóthểchuyển sang expression tree • Sửdụngthuậnlợihơnphươngthứcnặcdanh. • Nơinàocó Delegate vàphươngthứcnặcdanhthìcóthểdùngbiểuthức Lambda • Vídụ:
BIỂU THỨC LAMBDA • Cúpháp: • ([parameter list]) => statements; • parameter list: danhsáchcácthamsốtruyềnvào (luônđượcxemlàtham tri) • Vídụ: In cácphầntửcủamảngramànhình
BIỂU THỨC LAMBDA • Vídụ: Viếtbiểuthứctính (x+2)^y • delegateintdel(int i, int j); • staticdel doIt = (x, y) => { x = x + 2; • returnConvert.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) • delegateintdel1(int i); • staticdel1 doIt1 = (x) => { ?? Tự viết}; • int j = doIt1(5); • Có thể rút gọn staticdel1 doIt1 = x vì có 1 tham số.
BIỂU THỨC LAMBDA • Vídụ: Đoạn code bêndướilàmgì?
BIỂU THỨC LAMBDA • Tậphợpcá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ĩacácthamsố: • T, T1, T2.. : Generic parameter type (Kiểudữliệucủacácthamsốđầuvào) • TResult: kiểudữliệutrảvềcủa delegate
BIỂU THỨC LAMBDA • Vídụ: Sửdụng Lambda Expression đểmãhóamộtchuỗi:
BIỂU THỨC LAMBDA • Vídụ: Sửdụng Lambda Expression đểmãhóamộtchuỗi: string cryptText = EncryptString(“IBM”, 1, encryptAlgorithm);
BIỂU THỨC LAMBDA • Biểuthức Lambda cóthểsửdụngcácbiếncụcbộ, thamsốcủaphươngthứcđãđịnhnghĩanó.
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 • Truyvấndữliệutừcácnguồndữliệutheomôhìnhhướngđốitượngbằngchínhngônngữlậptrình (khônglệthuộcngônngữcủahệquảntrị CSDL) • Truyvấndữliệucácmảng, tậphợp, XML.. • Cáclớphỗtrợ LINQ thuộccáckhônggiantên:System.Linq, System.Linq.Expressions
TRUY CẬP DỮ LIỆU VỚI LINQ • Lậptrìnhtruyvấndữliệutheophươngpháptruyềnthống tiềmẩnnhiềulỗi
TRUY CẬP DỮ LIỆU VỚI LINQ • Mụctiêuthiếtkếcủa LINQ: • Thốngnhấtcúphápngônngữtruyvấntrêncácloạidữliệu (objects, relational data, XML) • Truyvấndữliệubằngngônngữlậptrình • Hạnchếlỗi (pháthiệnlỗi ở thờiđiểmbiêndịch)
TRUY CẬP DỮ LIỆU VỚI LINQ • Mụctiêuthiếtkếcủa LINQ: • Hổtrợngườilậptrìnhkhiviếtcáccâutruyvấn(IntelliSense support) • Hỗtrợgởrối (debug) • Tươngthíchhoàntoànvớinhữngcôngnghệ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ácthànhphầncơbảncủa LINQ: • Sequences:Cácđốitượngđãhiệnthực interface IEnumerable<T> (Array, List..) • Elements: Cácphầntửtrong sequence
TRUY CẬP DỮ LIỆU VỚI LINQ • Cácthànhphầncơbảncủa LINQ: • Query Operators:cácphươngthứcmởrộngthựchiệncácthaotáctrêncâulệnh LINQ(trongSystem.linq.Enumerablecókhoảng 40 operators) • Query Expression: Ngônngữtruyvấntíchhợpchophépthựchiệncáctruyvấntrêndữ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ộtsốtoántửtrong Query Operators khôngđượchỗtrợtrong Query expression, vìvậytrongmộtsốtrườnghợptaphảigọitrựctiếpcác Query Operators
TRUY CẬP DỮ LIỆU VỚI LINQ • Danhsáchcáctoántửchuẩn (standard operators):
TRUY CẬP DỮ LIỆU VỚI LINQ • Danhsáchcáctoántửchuẩn:
TRUY CẬP DỮ LIỆU VỚI LINQ • Danhsáchcáctoántử:
LINQ và ĐỐI TƯỢNG (OBJECT) • Cúphápcơbản: giốngnhư SQL, LINQ cũngcócáclệnhfrom, 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ántử Where nhậnmộtthamsốthứ 2(optional) kiểu int. Thamsốnàychobiếtvị 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ầntửđầutiên • Skip: bỏ n phầntửđầutiên
LINQ và ĐỐI TƯỢNG (OBJECT) • Filter: TakeWhile, SkipWhile • TakeWhile: Lấycácphầntửchođếnkhiđiềukiệnsai • SkipWhile: bỏ qua phầntửchođếnkhiđiềukiệnsaithìlấydữliệu
LINQ và ĐỐI TƯỢNG (OBJECT) • Distinct: trảvềdãycácphầntửlấytừ sequence saukhiđãbỏcácphầntửtrùng
LINQ và ĐỐI TƯỢNG – SelectMany SelectMany: Nốicácdãy con(subsequences) kếtquảthànhmộtdãy (sequence) Vídụ: Ta cómộtmảng Books[], mỗi book gồmcónhiềuthuộctính (XemSampleDatatrongLinqBooks.Common)
LINQ và ĐỐI TƯỢNG – SelectMany Đểlấydanhsáchtêncáctácgiảcủacácquyểnsách:
LINQ và SQL - DataContext • LINQ to SQL: chophéptruyvấndữliệuquảnlýbởi SQL SERVER • DataContext: Địnhnghĩacácthựcthể (Entities), từđótacóthểtruyvấndữliệu. • Cácthựcthể: • Ánhxạđếncácbảng quan hệ (Tables) • Chuyểnđổigiữacáccâulệnh LINQ vàcâulệnh SQL đểgửiđến CSDL