Cách sử dụng linq trong c#

LINQ - Language Integrated Query (tạm dịch là ngôn ngữ truy tìm vấn tích hợp) - là phương pháp tầm nã vấn tài liệu từ một tập hợp dữ liệu. Hôm nay, họ vẫn cùng mày mò về LINQ cùng phương thức buổi giao lưu của LINQ nhé.

Bạn đang xem: Cách sử dụng linq trong c#

Nói đến xây dựng, bọn họ không thể ko nói tới dữ liệu. Dữ liệu ở chỗ này có thể được khởi nguồn từ bộ nhớ lưu trữ, XML, cửa hàng dữ liệu (Mysql, Sql Server...)... xuất xắc bất cứ khu vực tàng trữ như thế nào khác. Bất cứ đọng dữ liệu kia khởi đầu từ đâu, chúng ta yêu cầu luôn luôn triển khai bài toán tầm nã vấn dữ liệu đến nó. Với mỗi mối cung cấp dữ liệu không giống nhau sẽ có các phương pháp không giống nhau nhằm triển khai truy nã vấn.Ví dụ:- Nếu họ có một danh sách được lưu giữ vào bộ nhớ, chúng ta cũng có thể thực hiện for, foreach kết hợp với các biểu thức đối chiếu nhằm truy vấn dữ liệu.- Nếu họ gồm dữ liệu trong file XML, họ bắt buộc truy vấn từng node để rất có thể chỉ dẫn các bạn dạng ghi hợp lệ.- Nếu chúng ta tất cả dữ liệu vào cửa hàng tài liệu, chúng ta đề nghị thực hiện tróc nã vấn vào bảng rồi trả về những phiên bản ghi hòa hợp lệ.- ...Có lẽ đây là lý do nhưng các kỹ sư Microsoft vẫn thực hiện thích hợp nhất giải pháp truy tìm vấn thành 1 để có thể cần sử dụng thông thường cho những nguồn tài liệu không giống nhau. LINQ ra đời và được cung ứng phiên bản .NET 3.5.

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

Nguồn dữ liệu.Tạo câu lệnh truy vấn vấn.Thực thi truy tìm vấn để đưa công dụng.

1. Nguồn dữ liệu

LINQ hỗ trợ cho họ phần đa providers khác nhau để hoàn toàn có thể truy nã vấn tới những mối cung cấp tài liệu khác nhau. Dưới đó là bảng providers cùng giải thích:

Tên providerMô tả
LINQ to lớn ObjectsSử dụng LINQ đối với các đối tượng người sử dụng collection cơ mà implement từ IEnumerable hoặcIEnumerable (tài liệu được lưu giữ vào cỗ nhớ). Được sử dụng rộng thoải mái quan trọng đặc biệt so với đa số bài toán thù phải hiệu năng cao.
LINQ khổng lồ SQLThực hiện tại maps các tables, views, store procedures thành những đối tượng. LINQ sẽ tiến hành tróc nã vấn trên các đối tượng kia bằng cách thay đổi hỗ tương thân đối tượng với câu lệnh sql.Ngoài tầm nã vấn ta cũng rất có thể tiến hành thêm/sửa/xóa tài liệu dựa trên những đối tượng trên.Hỗ trợ transaction.Ưu điểm: được sử dụng không ít vào thực tế dưới cái tên Entity Framework hoặc Entity Framework Core.Nhược điểm: chỉ làm việc cùng với cơ sở tài liệu là Squốc lộ Server.
LINQ khổng lồ EntitiesTương từ bỏ như LINQ to lớn Squốc lộ nhưng cung cấp những một số loại cơ sở tài liệu.Nhược điểm: sử dụng phức tạp. đa phần cửa hàng tài liệu không phù hợp áp dụng phổ biến cùng với .Net.

Xem thêm: Các Nghiệp Vụ Cơ Bản Của Giao Dịch Viên, Nghiệp Vụ Kế Toán Nội Bộ, Gdv/Kho Quỹ

LINQ to lớn DataSetsSự kết hợp thân LINQ với ADO.NET.
LINQ toXMLTruy vấn lên tiếng trong tệp tin XML.

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

Có 2 phương pháp để tạo ra câu truy nã vấn: cú pháp truy hỏi vấn (query syntax) và cú pháp cách tiến hành (method syntax). Và nhằm viết được câu truy tìm vấn bạn cần using thư viện System.Linq.Mình tất cả chuyển tạo thành class Car với list các Car để làm ví dụ đến 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 IList Cars get return new List 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 tầm nã vấn

Sử dụng cú pháp giống như bạn truy vấn cửa hàng dữ liệu. Mẫu cú pháp đã nlỗi sau:

var lists = from in < Biều thức lambda>select lấy ví dụ như sau sẽ hiển thị danh sách các xe cộ tất cả năm phân phối >= 1990.

class Program static void Main(string<> args) var cars = Car.Cars; var list = from item in cars where thành phầm.YearOfManufacture >= 1990 select item; foreach (var công trình in list) Console.WriteLine(item); /* * Output: * * 1 - Hondomain authority - 1990 * 4 - VinFast - 2017 */ Console.ReadKey(); Các bạn có thể tham khảo các phxay toán thù tầm nã vấn tại trên đây.Với biện pháp viết nlỗi này, chúng ta sẽ rất dễ dàng tiếp xúc do nó gần giống với truy tìm vấn các đại lý dữ liệu nhưng lại chúng ta vẫn không hiểu được thực chất của LINQ là gì cần tôi sẽ không còn đi thừa chi tiết. Vì Lúc biên dịch, cú pháp tróc nã vấn cũng mang đến cú pháp thủ tục.

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

Là mọi cách thức không ngừng mở rộng của IEnumerable hoặc IEnumerable.Với ví dụ trên bọn họ đổi khác code nlỗi sau:

class Program static void Main(string<> args) var cars = Car.Cars; var menu = cars.Where(f => f.YearOfManufacture >= 1990); foreach (var vật phẩm in list) Console.WriteLine(item); /* * Output: * * 1 - Honda - 1990 * 4 - VinFast - 2017 */ Console.ReadKey(); Chúng ta chú ý thấy rằng vào hàm Where mở ra tsay mê số cực kỳ ngùng ngoằng (f => f.YearOfManufacture >= 1990). Vậy tsay đắm số đó là gì vậy?Giờ chúng ta hãy xem signature của hàm Where:

public static IEnumerable Where(this IEnumerable source, Func predicate);Ohh, hóa ra nó là một biểu thức lambdomain authority nhưng mà mình đã nhắc chi tiết tại phía trên.Giờ chúng ta hãy thử viết một hàm LINQ bắt đầu nhỏng sau:

public static class CarExtenstion public static IEnumerable MyQuery(this IEnumerable danh mục, Func myCondition) foreach (var cống phẩm in list) if (myCondition(item)) yield return item; Chúng ta sử dụng hàm kia như sau:

class Program static void Main(string<> args) var cars = Car.Cars; var các mục = cars.MyQuery(f => f.YearOfManufacture >= 1990); foreach (var thành tựu in list) Console.WriteLine(item); /* * Output: * * 1 - Honda - 1990 * 4 - VinFast - 2017 */ Console.ReadKey(); Đến phía trên thì bọn họ sẽ đọc LINQ sử dụng trong C# ra làm sao với bí quyết viết những hàm LINQ. Cuối thuộc cũng là sự phối hợp giữa phương thức không ngừng mở rộng, lambdomain authority expression và yield return.

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

Có 2 kịch bạn dạng để thực thi truy tìm vấn:- Trì hoãn thực thi (Deferred Execution): câu hỏi tiến hành truy nã vấn chỉ Lúc tiến hành foreach nhỏng hình dưới đây

*
Sử dụng phương pháp triển khai này đã giúp:+ Cải thiện nay hiệu năng vì chưng chỉ thực thi một lượt.+ Dữ liệu trả về là mới nhất.- Thực thi ngay lập tức (Immediate Execution): xúc tiến tức thì nhanh chóng câu lệnh với trả về kết quả. Để tiến hành ngay mau chóng, bạn có thể dùng đa số toán thù tử thay đổi như ToList, ToArray, ToDictionary... hoặc hồ hết tân oán tử nhân tố như First, FirstOrDefault, Last, LastOrDefault...Với ví dụ bên trên, bọn họ sửa code lại như sau nhằm triển khai câu lệnh ngay lập tức lập tức:

class Program static void Main(string<> args) var cars = Car.Cars; var danh mục = cars.Where(f => f.YearOfManufacture >= 1990).ToList(); foreach (var sản phẩm in list) Console.WriteLine(item); /* * Output: * * 1 - Hondomain authority - 1990 * 4 - VinFast - 2017 */ Console.ReadKey();

4. Lưu ý

Sau Lúc tò mò mang lại phía trên, mình đân oán có tương đối nhiều bạn sẽ hỏi: Tại sao ko áp dụng for hoặc foreach kết hợp if để truy nã vấn? Hay LINQ hiệu năng như thế nào? Theo cách nhìn cá thể của bản thân thì bài toán áp dụng hay là không áp dụng LINQ còn tùy trực thuộc vào ý kiến của mỗi cá nhân. Mình ham mê sử dụng bởi vì thấy dễ viết, nthêm gọn gàng cùng dễ dàng debug. Về hiệu năng thì tuy nhiên LINQ bao gồm chậm trễ hơn so với bài toán áp dụng for hoặc foreach tuy vậy với câu hỏi thông số kỹ thuật máy vi tính, sever xịn như hiện nay thì khoảng lờ lững này cũng ko ảnh hưởng lắm cho hiệu năng.Dưới trên đây bản thân tất cả có tác dụng một phép so sánh giữa việc thực hiện for, foreach, LINQ các bạn hãy đọc 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, IList listGuid) { var length = listGuid.Count; var count = 0; for (int i = 0; i listGuid) var count = 0; foreach (var tác phẩm in listGuid) if (!cửa nhà.Contains(text)) continue; count++; return count; private static int FindByLinq(string text, IList listGuid) var các mục = listGuid.Where(f => f.Contains(text)); return danh mục.Count(); static IList RandomList() { var d = new List(); for (int i = 0; i Và tác dụng của một vài lần chạy demo nhỏng sau:Chỉ rộng kém nhẹm nhau có 6 (ms).

*
*
*

Kết luận:

Mình sẽ chia sẻ phần đa phát âm biết của chính bản thân mình về LINQ, vô cùng mong mỏi nó đang hữu ích mang lại chúng ta. Nếu gồm vướng mắc gì, hãy còn lại comment bên dưới nhé.