LINQ- Ngôn Ngữ Truy Vấn Tích Hợp Không Thể Không Biết

Chúng tôi rất vui mừng được chia sẻ kiến thức sâu sắc về từ khóa Linq c la gi để tối ưu hóa nội dung trang web và tiếp thị trực tuyến. Bài viết cung cấp phương pháp tìm kiếm, phân tích từ khóa và chiến lược hiệu quả. Cảm ơn sự quan tâm và hãy tiếp tục theo dõi để cập nhật kiến thức mới.

LINQ – Language Integrated Query (tạm dịch là tiếng nói truy vấn tích hợp) – là phương pháp truy vấn tài liệu từ một tập hợp tài liệu. Hôm nay, tất cả chúng ta sẽ cùng tìm hiểu về LINQ và phương pháp hoạt động của LINQ nhé.

Bạn Đang Xem: LINQ- Ngôn Ngữ Truy Vấn Tích Hợp Không Thể Không Biết

Nói đến lập trình, tất cả chúng ta không thể không nhắc đến tài liệu. Tài liệu ở đây có thể được bắt nguồn từ bộ nhớ, XML, cơ sở tài liệu (Mysql, Sql Server…)… hay bất luận nơi lưu trữ nào khác. Bất luận tài liệu đó bắt nguồn từ đâu, tất cả chúng ta phải xoành xoạch thực hiện việc truy vấn tài liệu đến nó. Với mỗi nguồn tài liệu khác nhau sẽ có được những cách khác nhau để thực hiện truy vấn.Ví dụ:- Nếu tất cả chúng ta có một list được lưu trong bộ nhớ, tất cả chúng ta có thể sử dụng for, foreach kết phù hợp với các biểu thức so sánh để truy vấn tài liệu.- Nếu tất cả chúng ta có tài liệu trong file XML, tất cả chúng ta phải truy vấn từng node để sở hữu thể đưa ra các bản ghi hợp thức.- Nếu tất cả chúng ta có tài liệu trong cơ sở tài liệu, tất cả chúng ta phải thực hiện truy vấn trong bảng rồi trả về các bản ghi hợp thức.- …Có nhẽ đây là lý do mà các kỹ sư Microsoft đã thực hiện thống nhất cách truy vấn thành 1 để sở hữu thể dùng chung cho những nguồn tài liệu khác nhau. LINQ ra đời và được thêm vào phiên bản .NET 3.5.

Thành phần cấu thành LINQ

  • Nguồn tài liệu.
  • Tạo câu lệnh truy vấn.
  • Thực thi truy vấn để lấy kết quả.

1. Nguồn tài liệu

LINQ cung cấp cho tất cả chúng ta những providers khác nhau để sở hữu thể truy vấn đến những nguồn tài liệu khác nhau. Sau đây là bảng providers và giảng giải:

Tên provider Mô tả LINQ to Objects Sử dụng LINQ so với các đối tượng người tiêu dùng collection mà implement từ IEnumerable hoặc IEnumerablevàlt;Tvàgt; (tài liệu được lưu trong bộ nhớ). Được sử dụng rộng rãi đặc biệt quan trọng so với những bài toán cần hiệu năng cao. LINQ to SQL Thực hiện map các tables, views, store procedures thành các đối tượng người tiêu dùng. LINQ sẽ thực hiện truy vấn trên các đối tượng người tiêu dùng đó bằng phương pháp chuyển đổi qua lại giữa đối tượng người tiêu dùng và câu lệnh sql.Ngoài truy vấn ta cũng sẽ có thể thực hiện thêm/sửa/xóa tài liệu dựa trên các đối tượng người tiêu dùng trên.Tương trợ transaction.Ưu điểm: được sử dụng khá nhiều trong thực tế dưới cái tên Entity Framework hoặc Entity Framework Core.Nhược điểm: chỉ thao tác với cơ sở tài liệu là SQL Server. LINQ to Entities Tương tự như LINQ to SQL nhưng tương trợ nhiều loại cơ sở tài liệu.Nhược điểm: sử dụng phức tạp. Nhiều cơ sở tài liệu không thích hợp sử dụng chung với .Net. LINQ to DataSets Sự phối hợp giữa LINQ và ADO.NET. LINQ to XML Truy vấn thông tin trong file XML.

2. Tạo câu lệnh truy vấn

Có 2 phương pháp để tạo ra câu truy vấn: cú pháp truy vấn (query syntax) và cú pháp phương thức (method syntax). Và để viết được câu truy vấn bạn cần phải using thư viện System.Linq.Mình có đưa tạo ra class Car và list các Car để làm ví dụ cho nội dung bài viết như sau:

public class Car { public int Id { get; set; } public string Name { get; set; } public int YearOfManufacture { get; set; } public override string ToString() { return string.Format(“{0} – {1} – {2}”, Id, Name, YearOfManufacture); } public static IListvàlt;Carvàgt; Cars { get { return new Listvàlt;Carvàgt; { new Car { Id = 1, Name = “Honda”, YearOfManufacture = 1990 }, new Car { Id = 2, Name = “Toyota”, YearOfManufacture = 1880 }, new Car { Id = 3, Name = “Mazda”, YearOfManufacture = 1925 }, new Car { Id = 4, Name = “VinFast”, YearOfManufacture = 2017 }, new Car { Id = 5, Name = “KIA”, YearOfManufacture = 1855 }, new Car { Id = 6, Name = “BMW”, YearOfManufacture = 1946 }, new Car { Id = 7, Name = “Merc”, YearOfManufacture = 1981 }, new Car { Id = 8, Name = “Abc”, YearOfManufacture = 1920 }, new Car { Id = 9, Name = “Def”, YearOfManufacture = 1940 }, new Car { Id = 10, Name = “Gij”, YearOfManufacture = 1944 } }; } } }

2.1. Cú pháp truy vấn

Sử dụng cú pháp giống như bạn truy vấn cơ sở tài liệu. Mẫu cú pháp sẽ như sau:

var lists = from <Biến lưu thông tin từng phần tửvàgt; in <Nguồn dữ liệuvàgt; [<Phép toán truy vấn: where, join … in, order by…> Biều thức lambda] select <Biến lưu thông tin từng phần tửvàgt;

Xem Thêm : Đơn vị cường độ dòng điện là gì? Công cụ đo và cách … – VietChem

Ví dụ sau sẽ hiển thị list các xe có năm sinh sản >= 1990.

class Program { static void Main(string[] args) { var cars = Car.Cars; var list = from item in cars where item.YearOfManufacture >= 1990 select item; foreach (var item in list) { Console.WriteLine(item); } /* * Output: * * 1 – Honda – 1990 * 4 – VinFast – 2017 */ Console.ReadKey(); } }

Các bạn cũng có thể tham khảo các phép toán truy vấn tại đây.Với cách viết như này, tất cả chúng ta sẽ rất dễ tiếp cận vì nó gần giống với truy vấn cơ sở tài liệu nhưng tất cả chúng ta sẽ không còn hiểu được thực chất của LINQ là gì nên tôi sẽ không còn đi quá cụ thể chi tiết. Vì khi biên dịch, cú pháp truy vấn cũng đưa về cú pháp phương thức.

2.2. Cú pháp phương thức

Là những phương thức mở rộng của IEnumerable hoặc IEnumerablevàlt;Tvàgt;.Với ví dụ trên tất cả chúng ta thay đổi code như sau:

class Program { static void Main(string[] args) { var cars = Car.Cars; var list = cars.Where(f => f.YearOfManufacture >= 1990); foreach (var item in list) { Console.WriteLine(item); } /* * Output: * * 1 – Honda – 1990 * 4 – VinFast – 2017 */ Console.ReadKey(); } }

Tất cả chúng ta để ý thấy rằng trong hàm Where xuất hiện thông số rất ngùng ngoằng (f => f.YearOfManufacture >= 1990). Vậy thông số đó là gì vậy? Giờ tất cả chúng ta hãy xem signature của hàm Where:

public static IEnumerablevàlt;TSourcevàgt; Wherevàlt;TSourcevàgt;(this IEnumerablevàlt;TSourcevàgt; source, Funcvàlt;TSource, boolvàgt; predicate);

Ohh, hóa ra nó là một biểu thức lambda mà tôi đã đề cập cụ thể chi tiết tại đây.Giờ tất cả chúng ta hãy thử viết một hàm LINQ mới như sau:

public static class CarExtenstion { public static IEnumerablevàlt;Tvàgt; MyQueryvàlt;Tvàgt;(this IEnumerablevàlt;Tvàgt; list, Funcvàlt;T, boolvàgt; myCondition) { foreach (var item in list) { if (myCondition(item)) yield return item; } } }

Xem Thêm : Technical Architect là gì? Làm sao để trở thành một Technical Architect?

Tất cả chúng ta sử dụng hàm đó như sau:

class Program { static void Main(string[] args) { var cars = Car.Cars; var list = cars.MyQuery(f => f.YearOfManufacture >= 1990); foreach (var item in list) { Console.WriteLine(item); } /* * Output: * * 1 – Honda – 1990 * 4 – VinFast – 2017 */ Console.ReadKey(); } }

Đến đây thì tất cả chúng ta đã hiểu LINQ sử dụng trong C# thế nào và cách viết các hàm LINQ. Cuối cùng cũng là sự việc phối hợp giữa phương thức mở rộng, lambda expression và yield return.

3. Thực thi truy vấn để lấy kết quả

Có 2 kịch bản để thực thi truy vấn:- Trì hoãn thực thi (Deferred Execution): việc thực thi truy vấn chỉ khi thực hiện foreach như hình về sauSử dụng cách thực thi này sẽ giúp:+ Cải thiện hiệu năng vì chỉ thực thi một lần.+ Tài liệu trả về là tiên tiến nhất.- Thực thi ngay tức khắc (Immediate Execution): thực thi ngay tức khắc câu lệnh và trả về kết quả. Để thực thi ngay tức khắc, tất cả chúng ta có thể dùng những toán tử chuyển đổi như ToList, ToArray, ToDictionary… hoặc những toán tử thành phần như First, FirstOrDefault, Last, LastOrDefault…Với ví dụ trên, tất cả chúng ta sửa code lại như sau để thực thi câu lệnh ngay tức khắc:

class Program { static void Main(string[] args) { var cars = Car.Cars; var list = cars.Where(f => f.YearOfManufacture >= 1990).ToList(); foreach (var item in list) { Console.WriteLine(item); } /* * Output: * * 1 – Honda – 1990 * 4 – VinFast – 2017 */ Console.ReadKey(); } }

4. Lưu ý

Sau lúc tìm hiểu đến đây, mình đoán có nhiều các bạn sẽ hỏi: Vì sao không sử dụng for hoặc foreach phối hợp if để truy vấn? Hay LINQ hiệu năng thế nào? Theo ý kiến thành viên của mình thì việc sử dụng hay là không sử dụng LINQ còn tùy thuộc vào ý kiến của mỗi người. Mình thích dùng vì thấy dễ viết, ngắn gọn và dễ debug. Về hiệu năng thì mặc dù LINQ có chậm hơn so với việc sử dụng for hoặc foreach tuy nhiên với việc cấu hình máy tính, sever khủng như hiện nay thì khoảng chừng chậm đó cũng không tác động lắm đến hiệu năng.Sau đây mình có làm một phép so sánh giữa việc sử dụng for, foreach, LINQ các bạn hãy tham khảo nhé:

class Program { static void Main(string[] args) { var text = “531d”; var listGuid = RandomList(); var stopWatch = new Stopwatch(); stopWatch.Start(); var count = FindByFor(text, listGuid); stopWatch.Stop(); var ms = stopWatch.Elapsed.TotalMilliseconds; Console.WriteLine(“For Execution Time: ” + ms + ” (ms). Count: ” + count + ” (items)”); stopWatch.Restart(); count = FindByForeach(text, listGuid); stopWatch.Stop(); ms = stopWatch.Elapsed.TotalMilliseconds; Console.WriteLine(“Foreach Execution Time: ” + ms + ” (ms). Count: ” + count + ” (items)”); stopWatch.Restart(); count = FindByLinq(text, listGuid); stopWatch.Stop(); ms = stopWatch.Elapsed.TotalMilliseconds; Console.WriteLine(“Linq Execution Time: ” + ms + ” (ms). Count: ” + count + ” (items)”); Console.ReadKey(); } private static int FindByFor(string text, IListvàlt;stringvàgt; listGuid) { var length = listGuid.Count; var count = 0; for (int i = 0; i < length; i++) { var item = listGuid[i]; if (!item.Contains(text)) continue; count++; } return count; } private static int FindByForeach(string text, IListvàlt;stringvàgt; listGuid) { var count = 0; foreach (var item in listGuid) { if (!item.Contains(text)) continue; count++; } return count; } private static int FindByLinq(string text, IListvàlt;stringvàgt; listGuid) { var list = listGuid.Where(f => f.Contains(text)); return list.Count(); } static IListvàlt;stringvàgt; RandomList() { var d = new Listvàlt;stringvàgt;(); for (int i = 0; i < 100000; i++) { d.Add(Guid.NewGuid().ToString()); } return d; } }

Và kết quả của một số lần chạy thử như sau:Chỉ hơn kém nhau có 6 (ms).

Tóm lại:

Tôi đã san sẻ những hiểu biết của mình về LINQ, rất mong nó sẽ có được ích cho những bạn. Nếu có thắc mắc gì, hãy để lại comment phía dưới nhé.

You May Also Like

About the Author: v1000

tỷ lệ kèo trực tuyến manclub 789club