Các truy vấn LINQ được dựa trên các dạng chung (generic), được giới thiệu ở phiên bản .NET framework 2.0. Bạn không cần tìm hiểu kỹ về các dạng chung (generics) trước khi bắt đầu viết truy vấn. Tuy nhiên, bạn cần hiểu rõ các khái niệm cơ bản.
Khi tạo 1 thể hiện (instance) cho 1 lớp tập hợp dạng chung như List<T>, bạn thay thế “T” bằng các dạng đối tượng để chứa trong danh sách (List). Ví dụ, một danh sách chuỗi được diễn giải là List<string>, và một danh sách các đối tượng Customer (lớp) được diễn giải là List<Customer>. Một danh sách chung là 1 dạng gắn kết chặt chẽ và cung cấp nhiều lợi ích trên các tập hợp chứa bên trong các phần tử của chúng dưới dạng Object (đối tượng). Nếu chúng ta thêm 1 Customer vào List<string>, điều này sẽ phát sinh lỗi, vì Customer là 1 lớp nên có kiểu dữ liệu không tương đương với string.
IEnumerable<T> là 1 giao diện cho phép các lớp tập hợp chung được liệt kê bằng cách dùng mệnh đề foreach. Các lớp tập hợp chung hỗ trợ IEnumerable<T> dưới dạng các lớp tập hợp không chung, chẳng hạn ArrayList hỗ trợ IEnumerable.
Các biến IEnumerable<T> trong các truy vấn LINQ
Các biến truy vấn LINQ được biểu diễn dưới dạng IEnumerable<T> hoặc là 1 dạng nào đó kế thừa IEnumerable<T>, ví dụ như IQueryable<T>. Khi chúng ta gặp 1 biến truy vấn có dạng IEnumerable<Customer>, điều này có nghĩa là, khi được thực thi, truy vấn sẽ sinh ra một chuỗi các đối tượng Customer hoặc không có đối tượng nào (rỗng).
// Tìm các khách hàng ở thành phố Đà Lạt
IEnumerable<Customer> customerQuery =
from cust in customers
where cust.City == "Đà Lạt"
select cust;
// Ghi danh sách LastName và FirstName của các khách hàng tìm được
foreach (Customer customer in customerQuery)
{
Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}
Dùng trình biên dịch xử lý các chỉ thị dạng chung
Nếu bạn thích, bạn có thể tránh dùng các cú pháp chung bằng cách dùng từ khóa var (kiểu dữ liệu không định rõ). Từ khóa var chỉ dẫn trình biên dịch suy luận dạng của biến truy vấn bằng cách nhìn vào nguồn dữ liệu được mô tả từ mệnh đề truy vấn. Hơn nữa, từ khóa var giúp giảm thiểu thời gian lập trình khi lập trình viên không cần phải nhớ tên của danh sách hoặc kiểu dữ liệu của các đối tượng trong danh sách.
var customerQuery2 =
from cust in customers
where cust.City == "Đà Lạt"
select cust;
foreach (var customer in customerQuery2)
{
Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}
Trong ví dụ trên, chúng ta thay từ khóa var cho IEnumerable<Customer> và Customer, do đó đoạn code nhìn gọn hơn. Tuy nhiên, nếu lạm dụng từ khóa var thì có thể chương trình của bạn gây khó hiểu vì phải xem xét và suy luận xem kiểu dữ liệu thực sự của biến là gì.