Như chúng ta đã biết từ môn Cơ sở dữ liệu, query (truy vấn) là một câu diễn đạt dùng để get dữ liệu từ một data source. Query thường được dùng trong các ngôn ngữ truy vấn như SQL trong hệ cơ sở dữ liệu của Microsoft, hay XQuery dùng trong XML. Vì vậy, người lập trình cần phải học thêm các ngôn ngữ truy vấn cho mỗi loại nguồn dữ liệu hoặc định dạng dữ liệu mà họ đang làm việc. LINQ được xây dựng để đơn giản hóa vấn đề này. Trong LINQ query, bạn luôn luôn làm việc với các object. Bạn sẽ dùng cùng một mẫu code nền tảng giống nhau để truy vấn và thao tác với các dữ liệu trong XML documents, SQL databases, ADO.NET Datasets, .NET collection…

Ba phần của một query operation

Tất cả mọi truy vấn LINQ đều phải thực hiện 3 hành động riêng biệt

  1. Xác định nguồn dữ liệu (Obtain the data source)
  2. Tạo câu truy vấn (Create the query)
  3. Thực thi câu truy vấn (Execute the query)

Ví dụ dưới đây sẽ mô tả 3 phần của một query operation. alt

Như các bạn thấy, trong LINQ, câu thực thi truy vấn được tách biệt khỏi lệnh truy vấn dữ liệu, nghĩa là nếu bạn chỉ tạo một biến truy vấn, bạn sẽ không thể nhận được bất kì dữ liệu nào. alt

The Data Source

Trong ví dụ trước, bởi vị nguồn dữ liệu sử dụng là một array, nên tất nhiên nó có hỗ trợ IEnumerable<T> interface. Điều này nghĩa là nó có thể được truy vấn bằng LINQ. Một câu truy vấn được thực thi trong lệnh foreach, và lệnh foreach thì yêu cầu phải được implement IEnumerable hoặc IEnumerable<T> interface. Các kiểu dữ liệu hỗ trợ IEnumerable<T> hoặc một derived interface như generic IQueryable<T> được gọi là queryable type (có thể truy vấn). Một kiểu dữ liệu queryable không yêu cầu bất kì sự thay đổi hoặc treatment đặc biệt nào để có thể trở thành LINQ data source. Nếu data source chưa thực sự nằm trong bộ nhớ như một queryable type, người lập trình phải mô tả để nó trở thành queryable. Ví dụ như LINQ trong XML, chúng ta cần phải load XML documents vào một kiểu dữ liệu queryable, đó là XElement:

alt

Hoặc đối với SQL database:

alt

Nói chung, bất kì đối tượng nào hỗ trợ giao diện IEnumerable<T> hoặc một giao diện khác kế thừa từ giao diện đó đều có thể trở thành một LINQ data source.

 

The Query

Câu truy vấn sẽ xác định thông tin nào cần phải lấy ra từ data sources. Một câu truy vấn còn có thể xác định loại thông tin lấy ra phải được sắp xếp, gom nhóm như thế nào (tương tự như SQL, tuy nhiên cần lưu ý là thứ tự của các clause này khác với thứ tự trong SQL). Mệnh đều from sẽ xác định data source, mệnh đề where sẽ lọc thông tin và mệnh đề select sẽ xác định kiểu của thông tin trả về. Một vấn đề quan trọng đã được đề cập từ trước: trong LINQ, các biến truy vấn không thể tự nó trả về dữ liệu được. Nó chỉ lưu trữ thông tin được truy vấn và sau này, khi câu truy vấn được thực thi sẽ cho ra kết quả.

 

Query Execution

Như đã đề cập trước đó, query variable chỉ lưu trữ các thông tin lấy ra từ data source. Bạn sẽ lấy các thông tin từ biến truy vấn trước đó thông qua câu lệnh foreach.

alt

Nguồn: MSDN