C# - C Sharp: Tổng quan Ngôn ngữ tích hợp truy vấn (LINQ)


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

Truy vấn tích hợp ngôn ngữ (Language-Integrated Query - LINQ) là tên của một tập hợp các công nghệ dựa trên việc tích hợp các khả năng truy vấn trực tiếp vào ngôn ngữ C#. Theo truyền thống, các truy vấn đối với dữ liệu được thể hiện dưới dạng các chuỗi đơn giản mà không cần kiểm tra kiểu tại thời điểm biên dịch hoặc hỗ trợ IntelliSense. Hơn nữa, bạn phải học một ngôn ngữ truy vấn khác nhau cho từng loại nguồn dữ liệu: cơ sở dữ liệu SQLtài liệu XML, các dịch vụ Web khác nhau, v.v. Với LINQ, truy vấn là cấu trúc ngôn ngữ hạng nhất, giống như các lớp, phương thức, sự kiện.

Bạn viết các truy vấn đối với các đối tượng collection có kiểu mạnh bằng cách sử dụng các từ khóa ngôn ngữ và các toán tử quen thuộc. Nhóm công nghệ LINQ cung cấp trải nghiệm truy vấn nhất quán cho các đối tượng (LINQ to Object), cơ sở dữ liệu quan hệ (LINQ to SQL) và XML (LINQ to XML).

Đối với nhà phát triển viết truy vấn, phần "tích hợp ngôn ngữ" dễ thấy nhất của LINQ là biểu thức truy vấn. Biểu thức truy vấn được viết bằng cú pháp truy vấn khai báo. Bằng cách sử dụng cú pháp truy vấn, bạn có thể thực hiện các thao tác lọc, sắp xếp và nhóm trên các nguồn dữ liệu với mức tối thiểu của code. Bạn sử dụng các mẫu biểu thức truy vấn cơ bản giống nhau để truy vấn và chuyển đổi dữ liệu trong cơ sở dữ liệu SQL, Bộ dữ liệu ADO.NET, tài liệu và luồng XML cũng như bộ sưu tập .NET và bất kỳ bộ sưu tập đối tượng nào hỗ trợ IEnumerable hoặc interface IEnumerable<T> generic. Hỗ trợ LINQ cũng được cung cấp bởi các bên thứ ba cho nhiều dịch vụ Web và triển khai cơ sở dữ liệu khác.

Ví dụ sau đây cho thấy thao tác truy vấn hoàn chỉnh. Thao tác hoàn chỉnh bao gồm việc tạo nguồn dữ liệu, định nghĩa biểu thức truy vấn và thực hiện truy vấn trong câu lệnh foreach.

// Specify the data source.
int[] scores = { 97, 92, 81, 60 };

// Define the query expression.
IEnumerable<int> scoreQuery =
    from score in scores
    where score > 80
    select score;

// Execute the query.
foreach (int i in scoreQuery)
{
    Console.Write(i + " ");
}

// Output: 97 92 81

Tổng quan về biểu thức truy vấn

  • Biểu thức truy vấn có thể được sử dụng để truy vấn và chuyển đổi dữ liệu từ bất kỳ nguồn dữ liệu nào có hỗ trợ LINQ. Ví dụ: một truy vấn có thể truy xuất dữ liệu từ cơ sở dữ liệu SQL và tạo ra luồng XML làm đầu ra.
  • Các biểu thức truy vấn rất dễ nắm bắt vì chúng sử dụng nhiều cấu trúc ngôn ngữ C# quen thuộc.
  • Tất cả các biến trong biểu thức truy vấn đều được định kiểu mạnh, mặc dù trong nhiều trường hợp bạn không cần phải cung cấp kiểu đó một cách rõ ràng vì trình biên dịch có thể suy ra kiểu đó. Để biết thêm thông tin, hãy xem Loại mối quan hệ trong hoạt động truy vấn LINQ.
  • Một truy vấn không được thực thi cho đến khi bạn lặp lại biến truy vấn, chẳng hạn như trong một câu lệnh foreach. Để biết thêm thông tin, hãy xem Giới thiệu về truy vấn LINQ.
  • Tại thời điểm biên dịch, các biểu thức truy vấn được chuyển đổi thành các lệnh gọi phương thức Toán tử truy vấn tiêu chuẩn theo các quy tắc được đặt ra trong đặc tả C#. Bất kỳ truy vấn nào có thể được thể hiện bằng cú pháp truy vấn cũng có thể được thể hiện bằng cú pháp phương thức. Tuy nhiên, trong hầu hết các trường hợp, cú pháp truy vấn dễ đọc và ngắn gọn hơn. Để biết thêm thông tin, hãy xem Đặc tả ngôn ngữ C# và Tổng quan về toán tử truy vấn tiêu chuẩn.
  • Theo nguyên tắc khi bạn viết truy vấn LINQ, lời khuyên là bạn nên sử dụng cú pháp truy vấn bất cứ khi nào có thể và cú pháp phương thức bất cứ khi nào cần thiết. Không có sự khác biệt về ngữ nghĩa hoặc hiệu suất giữa hai hình thức khác nhau. Các biểu thức truy vấn thường dễ đọc hơn các biểu thức tương đương được viết bằng cú pháp phương thức.
  • Một số thao tác truy vấn, chẳng hạn như Count hoặc Max, không có mệnh đề biểu thức truy vấn tương đương và do đó phải được biểu thị dưới dạng lệnh gọi phương thức. Cú pháp phương thức có thể được kết hợp với cú pháp truy vấn theo nhiều cách khác nhau. Để biết thêm thông tin, hãy xem Cú pháp truy vấn và cú pháp phương thức trong LINQ.
  • Biểu thức truy vấn có thể được biên dịch thành cây biểu thức hoặc delegate, tùy thuộc vào loại truy vấn được áp dụng. Truy vấn IEnumerable<T> được biên dịch cho các delegate. Các truy vấn IQueryable và IQueryable<T> được biên dịch thành cây biểu thức. Để biết thêm thông tin, hãy xem Cây biểu thức.

Cách bật truy vấn LINQ cho nguồn dữ liệu của bạn

Dữ liệu trong bộ nhớ

Có hai cách để bạn có thể kích hoạt truy vấn LINQ đối với dữ liệu trong bộ nhớ. Nếu dữ liệu thuộc kiểu thực thi IEnumerable<T>, bạn có thể truy vấn dữ liệu bằng cách sử dụng LINQ to Objects. Nếu việc kích hoạt tính năng liệt kê kiểu của bạn bằng cách thực thi interface IEnumerable<T> là không hợp lý, bạn có thể định nghĩa các phương thức toán tử truy vấn chuẩn LINQ trong kiểu đó hoặc tạo các phương thức toán tử truy vấn chuẩn LINQ mở rộng kiểu đó. Việc triển khai tùy chỉnh của toán tử truy vấn tiêu chuẩn nên sử dụng thực thi trì hoãn để trả về kết quả.

Dữ liệu từ xa

Tùy chọn tốt nhất để kích hoạt truy vấn LINQ của nguồn dữ liệu từ xa là thực thi interface IQueryable<T>. Tuy nhiên, điều này khác với việc mở rộng một nhà cung cấp như LINQ to SQL cho nguồn dữ liệu.

Nhà cung cấp LINQ có thể truy vấn được

Các nhà cung cấp LINQ thực thi IQueryable<T> có thể có độ phức tạp rất khác nhau.

Một nhà cung cấp IQueryable ít phức tạp hơn có thể giao tiếp với một phương thức duy nhất của dịch vụ Web. Kiểu nhà cung cấp này rất cụ thể vì nó mong đợi thông tin cụ thể trong các truy vấn mà nó xử lý. Nó có một hệ thống kiểu khép kín, có thể chỉ hiển thị một kiểu kết quả duy nhất. Hầu hết việc thực thi truy vấn diễn ra cục bộ, chẳng hạn như bằng cách sử dụng các thực thi Có thể đếm được của các toán tử truy vấn tiêu chuẩn. Nhà cung cấp ít phức tạp hơn có thể chỉ kiểm tra một biểu thức gọi phương thức trong cây biểu thức đại diện cho truy vấn và để logic còn lại của truy vấn được xử lý ở nơi khác.

Nhà cung cấp IQueryable có độ phức tạp trung bình có thể nhắm mục tiêu nguồn dữ liệu có ngôn ngữ truy vấn có tính biểu cảm một phần. Nếu nó nhắm mục tiêu một dịch vụ Web, nó có thể giao tiếp với nhiều phương thức của dịch vụ Web và chọn phương thức để gọi dựa trên câu hỏi mà truy vấn đặt ra. Nhà cung cấp có độ phức tạp trung bình sẽ có hệ thống loại phong phú hơn nhà cung cấp đơn giản, nhưng nó vẫn sẽ là hệ thống loại cố định. Ví dụ: nhà cung cấp có thể hiển thị các loại có mối quan hệ một-nhiều có thể được duyệt qua, nhưng nó sẽ không cung cấp công nghệ ánh xạ cho các loại do người dùng xác định.

Một nhà cung cấp IQueryable, chẳng hạn như nhà cung cấp LINQ to SQL, có thể dịch các truy vấn LINQ hoàn chỉnh sang ngôn ngữ truy vấn biểu cảm, chẳng hạn như SQL. Một nhà cung cấp phức tạp sẽ tổng quát hơn một nhà cung cấp ít phức tạp hơn vì nó có thể xử lý nhiều loại câu hỏi hơn trong truy vấn. Nó cũng có một hệ thống kiểu mở và do đó phải chứa cơ sở hạ tầng mở rộng để ánh xạ các kiểu do người dùng xác định. Phát triển một nhà cung cấp phức tạp đòi hỏi một lượng nỗ lực đáng kể.

» Tiếp: Giới thiệu về truy vấn LINQ
« Trước: I/O File
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!