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.
- Cú pháp truy vấn LINQ.
- 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 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
- Cú pháp truy vấn giống như cú pháp SQL (Ngôn ngữ truy vấn cấu trúc).
- 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ặcgroup by
. - 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.
- 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.
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.
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
- Cú pháp phương thức LINQ giống như gọi phương thức mở rộng.
- 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.
- 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.