Cú pháp truy vấn LINQ

Có hai cách cơ bản để viết truy vấn LINQ cho danh sách IEnumerable hoặc nguồn dữ liệu IQueryable.

  1. Cú pháp truy vấn LINQ.
  2. Cú pháp phương thức LINQ.

Cú pháp truy vấn LINQ

Cú pháp truy vấn tương tự như truy vấn SQL (Ngôn ngữ truy vấn có cấu trúc) cho cơ sở dữ liệu. Nó có cú pháp trong mã C# hoặc VB.NET như sau:

from <range variable> in <IEnumerable<T> or IQueryable<T> Collection>

<Standard Query Operators> <lambda expression>

<select or groupBy operator> <result formation>

Cú pháp truy vấn LINQ bắt đầu bằng từ khóa from và kết thúc bằng từ khóa select. Điều này ngược với cú pháp truy vấn SQL bắt đầu bằng từ khóa select.

Lý do bắt đầu bằng từ khóa from là IntelliSense sẽ biết trước được kiểu dữ liệu để hỗ trợ bạn gõ biểu thức truy vấn nhanh chóng.

Ví dụ dưới đây minh họa một biểu thức truy vấn LINQ trả về các chuỗi có chứa từ "Tutorials":

// string collection
IList<string> stringList = new List<string>() 
{ 
    "C# Tutorials",
    "VB.NET Tutorials",
    "Learn C++",
    "MVC Tutorials" ,
    "Java" 
};

// LINQ Query Syntax
var result = from s in stringList
             where s.Contains("Tutorials") 
             select s;

foreach(var item in result)
{
    Console.WriteLine(item);
}

Đây là kết quả khi biên dịch và thực thi chương trình trên:

C# Tutorials
VB.NET Tutorials
MVC Tutorials

Hình dưới đây cho thấy cấu trúc của cú pháp truy vấn LINQ.

Cú pháp biểu thức truy vấn LINQ

Cú pháp truy vấn bắt đầu bằng mệnh đề from theo sau là biến range. Từ khóa from có cấu trúc from s in strList có nghĩa là từ mỗi phần tử trong danh sách. Nó tương tự như một vòng lặp foreach:

foreach(var s in strList)
{
    // some code
}

Sau mệnh đề from, bạn có thể sử dụng các toán tử truy vấn tiêu chuẩn khác nhau để lọc, gom nhóm, nối các phần tử của danh sách. Có khoảng 50 toán tử truy vấn tiêu chuẩn có sẵn trong LINQ.

Trong ví dụ trên, chúng ta đã sử dụng toán tử where (còn được gọi là mệnh đề where) theo sau là một điều kiện. Điều kiện này thường được thể hiện bằng cách sử dụng biểu thức lambda.

Cú pháp truy vấn LINQ luôn kết thúc bằng mệnh đề select hoặc group by. Mệnh đề select được sử dụng để định hình dữ liệu. Bạn có thể chọn toàn bộ đối tượng hoặc chỉ một số thuộc tính của nó để trả về. Trong ví dụ đơn giản ở trên, do chỉ là danh sách chuỗi nền chúng tôi đã chọn những chuỗi thỏa điều kiện để trả về kết quả.

Trong ví dụ dưới đây, chúng tôi sử dụng cú pháp truy vấn LINQ để tìm ra các sinh viên có độ tuổi từ 13 đến 19 từ danh sách sinh viên.

// Student collection
IList<Student> studentList = new List<Student>() 
{ 
    new Student() { StudentID = 1, StudentName = "John", Age = 13},
    new Student() { StudentID = 2, StudentName = "Moin",  Age = 21 },
    new Student() { StudentID = 3, StudentName = "Bill",  Age = 18 },
    new Student() { StudentID = 4, StudentName = "Ram" , Age = 20},
    new Student() { StudentID = 5, StudentName = "Ron" , Age = 15 } 
};

// LINQ Query Syntax to find out teenager students
var result = (from s in studentList
              where s.Age > 12 && s.Age < 20
              select s).ToList();
foreach(var item in result)
{
    Console.WriteLine(item.StudentName);
}

Đây là kết quả khi biên dịch và thực thi chương trình trên:

John
Bill
Ron

Những điểm cần nhớ của cú pháp truy vấn LINQ

  1. Cú pháp truy vấn giống như cú pháp SQL (Ngôn ngữ truy vấn cấu trúc).
  2. Cú pháp truy vấn bắt đầu bằng mệnh đề from và có thể kết thúc bằng mệnh đề select hoặc group by.
  3. Sử dụng các thành phần khác như lọc, nối, nhóm, sắp xếp toán tử để xây dựng kết quả mong muốn.
  4. Biến được định kiểu ngầm định - var có thể được sử dụng để lưu trữ kết quả của truy vấn LINQ.

Cú pháp phương thức LINQ

Cú pháp phương thức LINQ sử dụng các phương thức mở rộng có trong hai lớp tĩnh là Enumerable hoặc Queryable, tương tự như cách bạn sẽ gọi các phương thức mở rộng của một lớp bất kỳ.

Tips: Trình biên dịch sẽ chuyển đổi cú pháp truy vấn LINQ thành cú pháp phương thức LINQ tại thời điểm biên dịch.

Ví dụ dưới đây minh họa một truy vấn sử dụng cú pháp phương thức LINQ trả về những chuỗi có chứa một từ "Tutorials".

// string collection
IList<string> stringList = new List<string>() 
{ 
    "C# Tutorials",
    "VB.NET Tutorials",
    "Learn C++",
    "MVC Tutorials" ,
    "Java" 
};

// LINQ Query Syntax
var result = stringList.Where(s => s.Contains("Tutorials")).ToList();
foreach(var item in result)
{
    Console.WriteLine(item);
}

Đây là kết quả khi biên dịch và thực thi chương trình trên:

C# Tutorials
VB.NET Tutorials
MVC Tutorials

Hình dưới đây minh họa cấu trúc của cú pháp phương thức LINQ.

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

Như bạn có thể thấy trong hình trên, cú pháp phương thức LINQ bao gồm các phương thức mở rộng và biểu thức lambda. Phương thức mở rộng Where được định nghĩa trong lớp Enumerable.

Nếu bạn kiểm tra chữ ký của phương thức mở rộng Where, bạn sẽ thấy phương thức này chấp nhận một predicate delegate là Func<Student, bool>.

Điều này có nghĩa là bạn có thể truyền bất kỳ phương thức nào chấp nhận đối tượng Student làm tham số đầu vào và trả về giá trị Boolean như trong hình dưới đây.

Biểu thức lambda hoạt động như một delegate được truyền vào phương thức Where.

Phương thức mở rộng Where trong LINQ

Ví dụ sau đây minh họa cách sử dụng cú pháp phương thức LINQ với danh sách IEnumerable<T>.

// Student collection
IList<Student> studentList = new List<Student>() 
{ 
    new Student() { StudentID = 1, StudentName = "John", Age = 13},
    new Student() { StudentID = 2, StudentName = "Moin",  Age = 21 },
    new Student() { StudentID = 3, StudentName = "Bill",  Age = 18 },
    new Student() { StudentID = 4, StudentName = "Ram" , Age = 20},
    new Student() { StudentID = 5, StudentName = "Ron" , Age = 15 } 
};

// LINQ Method Syntax to find out teenager students
var result = studentList.Where(s => s.Age > 12 && s.Age < 20)
                        .ToList();
foreach(var item in result)
{
    Console.WriteLine(item.StudentName);
}

Đây là kết quả khi biên dịch và thực thi chương trình trên:

John
Bill
Ron

Những điểm cần nhớ của cú pháp phương thức LINQ

  1. Cú pháp phương thức LINQ giống như gọi phương thức mở rộng.
  2. Cú pháp phương thức LINQ còn gọi là cú pháp thông thạo (fluent syntax) vì nó cho phép thực hiện hàng loạt các phương thức mở rộng.
  3. Biến được định kiểu ngầm định - var có thể được sử dụng để lưu trữ kết quả của truy vấn LINQ.
LINQ
Bài Viết Liên Quan:
Truy vấn LINQ phức tạp
Trung Nguyen 23/04/2020
Truy vấn LINQ phức tạp

Bạn sẽ tìm hiểu một số truy vấn LINQ phức tạp trong hướng dẫn này.

Từ khóa let, into trong LINQ
Trung Nguyen 23/04/2020
Từ khóa let, into trong LINQ

Từ khóa let, into trong LINQ có tác dụng gì? Hướng dẫn khai báo và sử dụng từ khóa let, into trong LINQ.

Thực thi truy vấn LINQ
Trung Nguyen 23/04/2020
Thực thi truy vấn LINQ

Trì hoãn thực thi truy vấn LINQ là gì? Thực thi ngay lập tức truy vấn LINQ là gì? Làm sao để thực thi truy vấn LINQ.

Expression trong LINQ
Trung Nguyen 23/04/2020
Expression trong LINQ

Expression trong LINQ là gì? Cây biểu thức trong LINQ là gì? Cách khai báo và sử dụng chúng trong LINQ.