TOC

This article is currently in the process of being translated into Vietnamese (~65% done).

LINQ:

Introduction

LINQ, là từ viết tắt của Language-Integrated Query là công nghệ xây dựng trong .NET cho phép bạn dễ dàng truy vấn và thao tác dữ liệu thông qua nhiều nguồn. Hay nói cách khác, bạn có thể làm việc với dữ liệu theo cùng cách mà khôn quan tâm nguồn dữ liệu là list, dictionary, file XML hay bảng trong cơ sở dữ liệu. LINQ có hai dạng cú pháp: truy vấn và phương thức. Chúng ta sẽ nói về cả hai trong các bài sau nhưng để bạn hứng thú hơn với LINQ thì cho phép tôi giới thiệu nhanh về cách LINQ có thể truy vấn một nguồn dữ liệu đơn giản:

var names = new List<string>()  
{  
    "John Doe",  
    "Jane Doe",  
    "Jenna Doe",  
    "Joe Doe"  
};  

// Get the names which are 8 characters or less, using LINQ  
var shortNames = from name in names where name.Length <= 8 orderby name.Length select name;

foreach (var name in shortNames)  
    Console.WriteLine(name);

Chỉ trên một dòng, dùng cú pháp truy vấn LINQ, tôi có thể lấy ra toàn bộ tên trong danh sách có ít hơn hay bằng 8 ký tự và sắp xếp theo độ dài! Chỉ MỘT dòng code và nó cho chúng ta thấy khả năng mà LINQ có thể làm! Trong bài tiếp theo, tôi sẽ đi lần lượt các khả năng mà bạn có thể dùng LINQ, nhưng trước tiên, chúng ta nói một chút về cách và khi nào dùng truy vấn LINQ.

Deferred execution

Các lập trình viên thường đọc code theo từng dòng vì vậy có thể rất ngạc nhiên nếu truy vấn LINQ không được thực hiện ngay khi dòng truy vấn được đọc tới. Thay vì đó, LINQ thực hiện ngay khi bạn dùng dữ liệu ví dụ khi bạn dùng phương thức ToList() hay Count(). Nó cũng có nghĩa bạn có thể xây dựng câu truy vấn nhiều dòng và nhiều thao tác nhưng dữ liệu chỉ thực sự được thực hiện khi bạn cần nó. Cho phép tôi minh họa phiên bản mở rộng của ví dụ trước nhưng chúng ta sẽ chuyển sang cú pháp phương thức thay vì cú pháp truy vấn như trước:

var names = new List<string>()
{
    "John Doe",
    "Jane Doe",
    "Jenna Doe",
    "Joe Doe"
};

// Get the names which are 8 characters or less, using LINQ
var shortNames = names.Where(name => name.Length <= 8);
// Order it by length
shortNames = shortNames.OrderBy(name => name.Length);
// Add a name to the original list
names.Add("Zoe Doe");

// Iterate over it - the query has not actually been executed yet!
// It will be as soon as we hit the foreach loop though!
foreach (var name in shortNames)
    Console.WriteLine(name);

I have added some comments to the code, so it should be easy to follow. Also, notice that I have added a bit of proof in there: After doing the query, I add a name to the original list. Now, if the query had already been executed, this would of course not make it into the result, but it does, because it's added after the query but BEFORE we actually use the data, which happens in the foreach loop.

This is not of great importance when querying a list with 4 or 5 names, but imagine that instead, we had a list of 10 million entries or perhaps a remote database somewhere. In that case, it's very important that we don't execute multiple queries when we can just execute one query.

Summary

LINQ allows you to simply and natively query various data sources using the same syntax - either the query syntax or the method syntax, which we'll discuss in the next article.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!