LINQ

LINQ - Language Integrated Query (trợ thì dịch là ngôn từ tróc nã vấn tích hợp) - là phương pháp truy hỏi vấn dữ liệu xuất phát từ 1 tập phù hợp tài liệu. Hôm nay, chúng ta đang cùng tìm hiểu về LINQ với cách thức hoạt động của LINQ nhé.

Bạn đang xem: Linq

Nói cho lập trình, họ thiết yếu ko nhắc tới tài liệu. Dữ liệu ở chỗ này có thể được khởi nguồn từ bộ nhớ, XML, cơ sở dữ liệu (Mysql, Sql Server...)... tuyệt bất cứ khu vực lưu trữ làm sao không giống. Bất cđọng tài liệu đó xuất phát từ đâu, chúng ta cần luôn luôn tiến hành việc tầm nã vấn dữ liệu đến nó. Với từng mối cung cấp tài liệu khác biệt sẽ có các phương pháp khác biệt để tiến hành truy tìm vấn.Ví dụ:- Nếu họ có một danh sách được giữ trong bộ nhớ lưu trữ, bạn có thể thực hiện for, foreach kết phù hợp với những biểu thức so sánh để truy hỏi vấn dữ liệu.- Nếu họ có dữ liệu vào file XML, họ bắt buộc truy nã vấn từng node nhằm hoàn toàn có thể đưa ra những phiên bản ghi thích hợp lệ.- Nếu chúng ta gồm dữ liệu vào các đại lý tài liệu, họ cần tiến hành truy vấn trong bảng rồi trả về những bạn dạng ghi vừa lòng lệ.- ...Có lẽ đấy là lý do mà những kỹ sư Microsoft sẽ triển khai hợp nhất giải pháp truy hỏi vấn thành 1 nhằm có thể dùng thông thường cho những nguồn tài liệu khác biệt. LINQ thành lập và được cung cấp 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 tìm vấn.Thực thi truy hỏi vấn để lấy tác dụng.

1. Nguồn dữ liệu

LINQ cung ứng mang lại bọn họ số đông providers khác biệt nhằm hoàn toàn có thể truy vấn tới những nguồn tài liệu khác biệt. Dưới đây là bảng providers với giải thích:

Tên providerMô tả
LINQ to lớn ObjectsSử dụng LINQ đối với những đối tượng người sử dụng collection nhưng implement tự IEnumerable hoặcIEnumerable (dữ liệu được lưu trong cỗ nhớ). Được sử dụng rộng rãi đặc trưng đối với đầy đủ bài tân oán buộc phải tính năng cao.
LINQ to SQLThực hiện tại maps các tables, views, store procedures thành các đối tượng người dùng. LINQ vẫn tiến hành tầm nã vấn trên các đối tượng người sử dụng đó bằng phương pháp chuyển đổi hỗ tương thân đối tượng người dùng cùng câu lệnh sql.Ngoài truy 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 vào những đối tượng người tiêu dùng trên.Hỗ trợ transaction.Ưu điểm: được thực hiện không ít vào thực tế dưới cái tên Entity Framework hoặc Entity Framework bộ vi xử lý Core.Nhược điểm: chỉ làm việc với các đại lý dữ liệu là Squốc lộ Server.
LINQ to EntitiesTương từ bỏ nhỏng LINQ to SQL cơ mà hỗ trợ các loại các đại lý dữ liệu.Nhược điểm: áp dụng phức hợp. Nhiều đại lý tài liệu ko tương thích sử dụng tầm thường cùng với .Net.

Xem thêm: Thi 2016: Điều Chỉnh Quy Trình Xét Tuyển Đại Học 2016 Và Xét Tuyển Đh

LINQ to DataSetsSự phối hợp giữa LINQ cùng ADO.NET.
LINQ toXMLTruy vấn ban bố trong file XML.

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

Có 2 cách để tạo thành câu tầm nã vấn: cú pháp tầm nã vấn (query syntax) và cú pháp thủ tục (method syntax). Và để viết được câu truy nã vấn bạn cần using thư viện System.Linq.Mình tất cả gửi tạo thành class Car với danh sách những Car để làm ví dụ mang đến bài viết nlỗi 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 truy tìm vấn

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

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

class Program static void Main(string<> args) var cars = Car.Cars; var danh sách = from nhà cửa in cars where thành quả.YearOfManufacture >= 1990 select item; foreach (var thắng lợi 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 những phép toán truy hỏi vấn tại phía trên.Với phương pháp viết nlỗi này, họ sẽ khá dễ tiếp cận vì chưng nó gần giống cùng với truy tìm vấn cửa hàng dữ liệu tuy vậy bọn họ sẽ không hiểu được bản chất của LINQ là gì yêu cầu tôi sẽ không đi thừa cụ thể. Vì Khi biên dịch, cú pháp truy hỏi vấn cũng mang đến cú pháp cách tiến hành.

2.2. Cú pháp pmùi hương thức

Là đều cách tiến hành mở rộng của IEnumerable hoặc IEnumerable.Với ví dụ bên trên chúng ta biến đổi code nhỏng sau:

class Program static void Main(string<> args) var cars = Car.Cars; var danh mục = cars.Where(f => f.YearOfManufacture >= 1990); foreach (var thành công in list) Console.WriteLine(item); /* * Output: * * 1 - Honda - 1990 * 4 - VinFast - 2017 */ Console.ReadKey(); Chúng ta xem xét thấy rằng trong hàm Where xuất hiện tsay đắm số siêu loằng ngoằng (f => f.YearOfManufacture >= 1990). Vậy tđắm say số sẽ là gì vậy?Giờ bọn họ hãy coi signature của hàm Where:

public static IEnumerable Where(this IEnumerable source, Func predicate);Ohh, hóa ra nó là 1 trong những biểu thức lambdomain authority nhưng mà tôi đã đề cập chi tiết trên đây.Giờ họ thử viết một hàm LINQ new nlỗi sau:

public static class CarExtenstion public static IEnumerable MyQuery(this IEnumerable các mục, Func myCondition) foreach (var sản phẩm in list) if (myCondition(item)) yield return item; Chúng ta áp dụng hàm đó nlỗi sau:

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

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

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

*
Sử dụng bí quyết xúc tiến này sẽ giúp:+ Cải thiện nay hiệu năng vì chưng chỉ thực hiện một đợt.+ Dữ liệu trả về là tiên tiến nhất.- Thực thi ngay lập tức (Immediate Execution): thực thi ngay chớp nhoáng câu lệnh với trả về hiệu quả. Để xúc tiến tức thì nhanh chóng, bạn cũng có thể dùng phần lớn toán thù tử đổi khác nlỗi ToList, ToArray, ToDictionary... hoặc đầy đủ toán thù tử thành phần nhỏng First, FirstOrDefault, Last, LastOrDefault...Với ví dụ trên, chúng ta sửa code lại như sau để tiến hành câu lệnh tức thì lập tức:

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

4. Lưu ý

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

*
*
*

Kết luận:

Mình đang share phần đa phát âm biết của mình về LINQ, khôn cùng ý muốn nó vẫn có lợi mang lại chúng ta. Nếu gồm thắc mắc gì, hãy để lại bình luận bên dưới nhé.