LINQ (Language Built-in Question) trong C | Tự động học ICT

LINQ là 1 bí quyết tiếp cận để thống nhất việc truy vấn dữ liệu trong C# (và Visible Primary .NET) chuyên dùng để truy vấn dữ liệu từ nhiều nguồn khác nhau.

Dí dụ, trước đây để làm cho việc sở hữu những cơ sở dữ liệu quan hệ (MySQL, SQL Server) chúng ta cần dùng ngôn ngữ truy vấn SQL. Tuy nhiên ngôn ngữ này hoàn toàn khác biệt sở hữu ngôn ngữ lập trình làm cho người lập trình cần dùng 2 loại ngôn ngữ khác nhau cùng lúc.

Cú pháp của LINQ được tích hợp thẳng trong ngôn ngữ C# (và VB.NET) giúp loại bỏ sự khác biệt giữa ngôn ngữ lập trình và những ngôn ngữ dùng để truy vấn dữ liệu, cũng như tạo ra 1 giao diện lập trình thống nhất (dùng cùng 1 nhóm lệnh truy vấn) dùng cho nhiều loại nguồn dữ liệu khác nhau (SQL Server, Xml, dịch vụ net, tập hợp object, v.v.). Qua đấy, LINQ giúp loại bỏ đề nghị dùng nhiều loại ngôn ngữ khác nhau trong quy trình truy vấn dữ liệu.

Language Built-in Question (LINQ) trong C#

Để dùng LINQ cần có cha thành phần: nguồn dữ liệu (information supply), truy vấn (question), lời gọi thực hành truy vấn (question execution).

Nguồn dữ liệu

Những truy vấn LINQ trong C# đều tác động trên nguồn dữ liệu. Để người lập trình có thể dùng chung 1 bí quyết thức viết code cho dù truy vấn từ nhiều loại nguồn dữ liệu khác nhau, LINQ luôn luôn làm cho việc sở hữu object. Do đấy, đối sở hữu từng loại nguồn dữ liệu trong C# cần xây dựng thư viện tương trợ LINQ (LINQ supplier) riêng giúp chuyển đổi dữ liệu về dạng object và ngược lại.

Vì nguyên nhân này, đối sở hữu dữ liệu Xml người ta cần xây dựng thêm supplier “LINQ lớn Xml”, sở hữu cơ sở dữ liệu SQL Server người ta cần xây dựng thêm supplier “LINQ lớn SQL”, v.v..

Hình minh họa dưới đây mô tả vai trò của LINQ trong quan hệ sở hữu ngôn ngữ lập trình C# và những nguồn dữ liệu.

Kiến trúc và vị trí của LINQ
Kiến trúc và vùng vị trí của LINQ

Nguồn dữ liệu IEnumerable và IQueryable

Từ 1 góc nhìn khác, LINQ thực chất là 1 bộ thư viện phương thức mở rộng (extension technique) cho những class thực thi 2 giao diện (interface) IEnumerable và IQueryable. Toàn bộ những class và interface cho LINQ đều đặt trong namespace sentayho.com.vn, vốn được dùng mặc định lúc tạo new file mã nguồn cho bất kỳ class nào.

Những phương thức mở rộng của LINQ được xây dựng trong 2 class tĩnh Enumerable và Queryable.

Lớp Enumerable chứa những phương thức mở rộng dành cho những class thực thi giao diện IEnumerable<T>, bao gồm những kiểu dữ liệu quen thuộc thuộc ko gian tên sentayho.com.vnric như Listing<T>, Dictionary<TKey, TValue> (bên cạnh ra còn có SortedList<T>, Queue<T>, HashSet<T>, LinkedList<T>, v.v.).

Lớp Queryable chứa những phương thức mở rộng dành cho những class thực thi giao diện IQueryable<T> (dí dụ Entity framework). Vì nguyên nhân này, toàn bộ những class thực thi những giao diện trên đều có thể trở nên nguồn dữ liệu.

Truy vấn LINQ trong C#

Cú pháp truy vấn và cú pháp phương thức

Có 2 bí quyết viết cho LINQ là cú pháp truy vấn (question syntax) và cú pháp phương thức (technique syntax).

  • Cú pháp truy vấn (Question Syntax): Cú pháp này nhìn giống như 1 truy vấn choose SQL đảo ngược sở hữu từ khóa trước tiên là from, kết thúc là choose. Cú pháp này có hình thức khác biệt sở hữu code C# thông thường sở hữu 1 số từ khóa new.
  • Cú pháp phương thức (Methodology Syntax, còn gọi là Fluent): giống như bí quyết gọi 1 phương thức mở rộng bình thường trên object của class. Đây lối viết cơ bản của LINQ.
  • Cú pháp pha trộn (combined syntax): thực tế là 1 số phương thức LINQ ko được tương trợ trên dạng question syntax, lúc đấy người ta có thể dùng lối viết pha trộn của cả 2 loại cú pháp.
Xem Thêm  Phần mềm dịch cả file PDF từ tiếng Anh sang tiếng Việt

Có 1 số điểm lưu ý lúc lựa chọn bí quyết viết:

  1. 1 số phương thức chỉ viết được theo cú pháp phương thức, ko viết được sở hữu cú pháp truy vấn;
  2. cú pháp truy vấn sẽ được chuyển sang cú pháp phương thức trên giai đoạn biên dịch, vì vậy 2 bí quyết viết không có chi khác biệt về hiệu suất trên giai đoạn thực thi;
  3. ví dụ quen thuộc sở hữu dùng biểu thức lambda, cú pháp phương thức dễ dàng dùng hơn và ko đòi hỏi cần học thêm 1 lối viết new;
  4. việc lựa chọn mang trong mình tính cá nhân, tuy nhiên nên dùng thống nhất.

Lối viết này luôn đề nghị phân phối 1 hàm lambda để gọi đối sở hữu từng phần tử của chuỗi dữ liệu. Lúc quen thuộc sở hữu việc dùng hàm lambda, lối viết này hoàn toàn giống như gọi hàm thông thường và ko đề nghị cần học thêm gì cả.

Cú pháp truy vấn nhìn giống như truy vấn SQL viết ngược lại. Lối viết này phân phối 1 bí quyết khác để mô tả hàm xử lý phần tử thay thế vì quản lý phân phối hàm lambda làm cho tham số.

Trong bài học này bạn sẽ chỉ học bí quyết dùng cú pháp phương thức. Ví dụ muốn, bạn có thể tự động tìm hiểu cú pháp phương thức. Cú pháp phương thức giúp code “có tính C#” hơn.

Danh sách phương thức truy vấn LINQ

Danh sách phân loại những phương thức truy vấn được liệt kê trong bảng dưới đây:

NhómPhương thứcLọc dữ liệuWhere, OfTypeSắp xếpOrderBy, OrderByDescending, ThenBy, ThenByDescending, ReverseNhómGroupBy, ToLookupGhép nốiGroupJoin, JoinPhép chiếuSelect, SelectManyPhép gộpAggregate, Common, Rely, LongCount, Max, Min, SumĐịnh lượngAll, Any, ContainsLấy phần tửElementAt, ElementAtOrDefault, First, FirstOrDefault, Final, LastOrDefault, Single, SingleOrDefaultTập hợpDistinct, Besides, Intersect, UnionPhân đoạnSkip, SkipWhile, Take, TakeWhileGhép dữ liệuConcatĐẳng thứcSequenceEqualSinh dữ liệuDefaultEmpty, Empty, Vary, RepeatBiến đổiAsEnumerable, AsQueryable, Solid, ToArray, ToDictionary, ToList

Thông qua tên gọi chúng ta có thể hình dung sơ qua về khả năng của những phương thức.

Đặc biệt, ví dụ quen thuộc sở hữu ngôn ngữ SQL, nhiều phương thức trong danh sách trên có tên gọi và khả năng tương đồng sở hữu những lệnh của SQL.

Chúng ta tạm thời chưa cần hiểu rõ toàn bộ những phương thức trên. Trong phần tiếp theo chúng ta sẽ tìm hiểu bí quyết dùng cụ thể của 1 số phương thức phổ cập} nhất thông qua những dí dụ.

Thực thi truy vấn LINQ trong C#

1 truy vấn LINQ ko được thực thi ngay lúc chương trình thực hành tới lệnh đấy. Chỉ lúc nào có những hoạt động thực sự cần tới dữ liệu từ truy vấn đấy (dí dụ như thông qua danh sách dữ liệu), truy vấn new được thực hành. Việc trì hoãn thực hành truy vấn như vậy có tên gọi là thực thi trễ (deferred execution).

Việc thực thi trễ có tác dụng lớn tới việc nâng cao hiệu suất xử lý vì nó hạn chế thực thi những lệnh chưa cần thiết. Cơ chế thực thi trễ ứng dụng cho toàn bộ những nguồn dữ liệu tương trợ LINQ hiện tại (LINQ lớn Objects, LINQ lớn SQL, LINQ lớn Entities, LINQ lớn XML).

Trong 1 số trường hợp chúng ta cần thực thi truy vấn ngay lúc chương trình chạy tới vùng vị trí lệnh đấy. Để thực hành cơ chế này, chúng ta gọi tới 1 trong số những phương thức biến đổi dữ liệu khởi đầu bằng “Lớn”: ToArray, ToList.

Dùng 1 số phương thức LINQ trong C#

Trên phần trên chúng ta đã xem xét những vấn đề cơ bản để hiểu tư tưởng chung của LINQ. Trong phần này chúng ta sẽ xem 1 số dí dụ minh họa cụ thể. Trong những dí dụ, chúng ta sẽ dùng lớp thực thể Contact như sau:

Xem Thêm  Đánh giá về mp là gì trong recreation

non-public class Contact { public int Age { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Tackle { get; set; } }

Nguồn dữ liệu:

var contacts = new Listing<Contact> { new Contact{ Age = 11, FirstName = “Trump”, LastName = “Donald”, Tackle = “Ha Noi”}, new Contact{ Age = 21, FirstName = “Omaba”, LastName = “Barrack”, Tackle = “Sai Gon”}, new Contact{ Age = 31, FirstName = “Bush”, LastName = “George”, Tackle = “Ha Noi”}, new Contact{ Age = 41, FirstName = “Invoice”, LastName = “Clinton”, Tackle = “Da Nang”}, new Contact{ Age = 51, FirstName = “Reagan”, LastName = “Ronald”, Tackle = “Da Nang”}, new Contact{ Age = 61, FirstName = “Jimmy”, LastName = “Carter”, Tackle = “Sai Gon”}, new Contact{ Age = 71, FirstName = “Gerald”, LastName = “Ford”, Tackle = “Ha Noi”}, new Contact{ Age = 81, FirstName = “Nixon”, LastName = “Richard”, Tackle = “Ha Noi”}, };

Sau đây chúng ta sẽ xem xét bí quyết dùng 1 số phương thức cụ thể của LINQ thông qua những dí dụ.

Lưu ý dùng ko gian tên sentayho.com.vn

Phương thức The place

The place là phương thức dùng để lọc dữ liệu theo những tiêu chí nào đấy và trả về 1 danh sách dữ liệu khác (chỉ chứa những dữ liệu ưu thích tiêu chí). Chúng ta xem xét việc dùng The place qua 1 số dí dụ:

Bắc buộc 1: lập danh sách những người có liên hệ là “Ha Noi”.

Đây là đề nghị lọc dữ liệu theo tiêu chí trường Tackle của object cần chứa giá trị “Ha Noi”. Chúng ta dùng phương thức lọc The place trên nguồn dữ liệu contacts.

Như chúng ta thấy, Intellisense phân phối mô tả của phương thức này sở hữu 2 overload:

overload thứ 1 của phương thức The place
overload thứ 2 của phương thức The place

Overload thứ 1 tiếp nhận 1 biến thuộc kiểu delegate Func<Contact, bool>.

Overload thứ 2 tương tự động như vậy nhưng trong phương thức tham số có thêm 1 biến đầu vào kiểu int dùng để chứa index của phần tử.

Như trên phần trên đã giải thích, Func<Contact, bool> là kiểu delegate tương ứng sở hữu phương thức có đầu vào kiểu Contact (kiểu dữ liệu cơ sở của biến contacts) và trả về kết quả kiểu bool. Phương thức này sẽ được gọi trên từng phần tử của contacts.

Ví dụ phương thức trả về kết quả true thì phần tử đấy sẽ được thêm vào danh sách kết quả. Kết quả trả về của phương thức The place là 1 biến thuộc kiểu IEnumerable<Contact>, vốn có thể truy xuất tương tự động như mảng.

Bạn nên học bí quyết đọc mô tả phương thức LINQ để có thể chủ động tìm hiểu bí quyết dùng của những phương thức. Có hơn 40 phương thức LINQ. Trong bài giảng này chúng ta ko thể chỉ dẫn toàn bộ mà chỉ chỉ dẫn bí quyết đọc và bí quyết học là chính. Lúc cần dùng tới phương thức nào có thể tự động học được.

Sở hữu đề nghị trên chúng ta có thể viết truy vấn như sau:

  1. var hn = sentayho.com.vne(c => c.Tackle == “Ha Noi”);
  2. foreach (var c in hn) sentayho.com.vneLine($”{c.FirstName} {c.LastName}”);

Như đã biết, trên vùng vị trí tham số này có thể phân phối hàm lambda, phương thức cục bộ, phương thức occasion, phương thức tĩnh, phương thức vô danh. Trên đây chúng ta dùng hàm lambda cho gọn.

Do truy vấn LINQ dùng cơ chế thực thi trễ, chỉ tới lúc gọi lệnh thông qua danh sách, truy vấn trên new được thực thi để trả dữ liệu về cho biến hn.

Bắc buộc 2: hãy lọc toàn bộ những object nằm trên vùng vị trí lẻ

Theo đề nghị này, chúng ta cần lọc ra toàn bộ những object có index 1, 3, 5, v.v.. Để thực hành đề nghị này, chúng ta dùng overload thứ 2 của phương thức The place:

var odd = sentayho.com.vne((c, i) => i % 2 != 0); foreach (var c in odd) sentayho.com.vneLine($”{c.FirstName} {c.LastName}”);

Overload thứ 2 có thêm tham số đầu vào thứ 2 thuộc kiểu int. Tham số này chứa index của phần tử đang được thông qua. Lúc có giá trị index chúng ta dễ dàng tính ra những phần tử trên vùng vị trí lẻ.

Xem Thêm  TTT là gì? TTT trong 5 trên Fb thực ra là gì?

Phương thức Choose

Phương thức Choose có vai trò siêu giống sở hữu truy vấn choose của ngôn ngữ SQL. Nhiệm vụ của nó là biến đổi object từ dạng này sang dạng khác, gọi là “projection” – phép chiếu.

Bắc buộc 1: hãy tạo ra 1 danh sách họ tên của những contact (chứ ko cần lấy trọn vẹn dữ liệu của từng contact) theo dạng: “Donald Trump”, “Barrack Obama”, v.v.

Chúng ta thấy dữ liệu theo đề nghị ko còn giống như dữ liệu gốc nữa. Chúng ta cần thông qua qua danh sách dữ liệu. Sở hữu từng phần tử cần trích lấy họ và tên rồi ghép lại sở hữu nhau tạo ra 1 object new. Những object new sẽ tập trung vào 1 danh sách riêng.

Phương thức Choose được dùng cho những phần đích biến đổi như vậy:

Danh sách tham số của truy vấn Choose

Lúc đọc mô tả này có thể xác định: đầu vào của Choose là 1 biến kiểu delegate Func<Contact, TResult> (gọi là selector – hàm chọn). Delegate này tương ứng sở hữu những phương thức có kiểu đầu vào là Contact (kiểu cơ sở của dữ liệu), kiểu đầu ra (TResult) do người lập trình tự động xác định.

Phương thức tham số này có nhiệm vụ chuyển những dự liệu cần thiết từ biến kiểu Contact sang biến kiểu TResult. Kết quả thực hành của phương thức Choose là 1 danh sách object thuộc kiểu đích TResult.

  1. var names = sentayho.com.vnct(c => $”{c.FirstName} {c.LastName}”);
  2. foreach (string title in names) sentayho.com.vneLine(title);

Phương thức Choose thường được dùng sở hữu kiểu vô danh và từ khóa var và có thể ứng dụng lọc dữ liệu (sở hữu phương thức The place).

Bắc buộc 2: Hãy lấy ra danh sách họ tên của những contact có tuổi bé hơn 50.

var youngs = contacts .The place(c => c.Age < 50) .Choose(c => new { FullName = $”{c.FirstName} {c.LastName}”, c.Age }); foreach (var c in youngs) { sentayho.com.vneLine($”Full title: {c.FullName}; Age: {c.Age}”); }

Trên đây, chúng ta ứng dụng phương thức The place để lọc lấy những contact có tuổi dưới 50. Trong danh sách này, chúng ta lại ứng dụng projection để tạo ra kết quả là danh sách của những object thuộc kiểu vô danh chứa 2 thuộc tính FullName và Age, được tạo thành từ dữ liệu của từng contact.

Qua 2 chỉ dẫn trên chúng ta thấy, việc học bí quyết dùng những phương thức LINQ là tương đối đơn giản ví dụ như nắm chắc chắn những khái niệm thường dùng. Bạn có thể tự động mình tìm hiểu thêm bí quyết dùng những phương thức khác bằng bí quyết đọc mô tả của phương thức như đã thực hành trên những dí dụ trên.

Kết luận

Bài học đã phân phối cho bạn tương đối toàn bộ thông tin về kiến trúc và kỹ thuật lập trình sở hữu LINQ trong C#. LINQ chứa siêu nhiều phương thức (extension technique) sở hữu nhiều overload khác nhau. Do đấy bài học ko có ý định phân phối toàn bộ mọi thứ về LINQ vì đây sẽ là 1 chủ đề chuyên sâu riêng trong web site.

Tuy nhiên dựa trên những tri thức này, bạn hoàn toàn có thể tự động mình tìm hiểu bí quyết dùng những phương thức khác của LINQ 1 bí quyết dễ dàng.

+ Ví dụ bạn thấy web site hữu ích, trước lúc đi đi hãy viện trợ web site bằng 1 hành động bé để web site có thể phát triển thành và dùng cho bạn phải chăng hơn.+ Ví dụ bạn thấy bài viết hữu ích, hãy giúp chia sẻ tới mọi người.+ Ví dụ có thắc mắc hoặc cần trao đổi thêm, mời bạn viết trong phần thảo luận cuối trang.Cảm ơn bạn!