[LINQ] Phần 5: Các kiểu quan hệ trong truy vấn LINQ

244 lượt xem

Một truy vấn LINQ được thể hiện chặt chẽ ở dữ liệu nguồn, trong truy vấn chính nó, và trong việc thực thi truy vấn đó. Các kiểu biến trong truy vấn LINQ phải tương thích với các phần tử trong dữ liệu và với kiểu biến lặp trong mệnh đề forearch. Điều này đảm bảo rằng các lỗi về kiểu được bắt lỗi lúc biên dịch để có thể sửa cho đúng trước khi người dùng tương tác với các lỗi này. Trong bài này, chúng ta sẽ lần lượt xem xét các kiểu quan hệ trong LINQ để có cái nhìn rõ hơn về cách LINQ hoạt động và thực thi.

Các truy vấn không chuyển đổi dữ liệu nguồn (Source Data)
Hình sau đây mô tả 1 truy vấn chuyển dữ liệu từ LINQ sang đối tượng mà không có thay đổi dữ liệu. Nguồn dữ liệu là 1 danh sách chứa các chuỗi và đầu ra của truy vấn cũng là 1 danh sách các chuỗi.

  1. Đối số kiểu của nguồn dữ liệu định nghĩa kiểu của biến phạm vi.
  2. Kiểu của đối tượng được chọn (select name) dùng để xác định kiểu của biến truy vấn (IEnumerable<string>). Trong hình, biến name có kiểu là 1 chuỗi, vì vậy biến truy vấn là 1 IEnumerable<string>.
  3. Biến truy vấn được lặp trong mệnh đề foreach. Bởi vì biến truy vấn là 1 danh sách chuỗi, biến lặp cũng là 1 chuỗi.

Trong truy vấn trên, kết quả không làm thay đổi dữ liệu từ nguồn dữ liệu, rõ ràng chúng ta thấy đầu vào là 1 danh sách chuỗi nameList (mỗi phần tử kiểu string) và đầu ra cũng là 1 danh sách chuỗi tên nameQuery (mỗi phần tử kiểu string).

Truy vấn chuyển đổi nguồn dữ liệu (Source Data)
Tiếp theo, chúng ta có ví dụ về một truy vấn từ LINQ sang SQL với sự thay đổi đơn giản trên nguồn dữ liệu.

  1. Đối số kiểu của nguồn dữ liệu định nghĩa kiểu của biến phạm vi.
  2. Mệnh đề select trả về thuộc tính Name thay vì đối tượng Student. Vì Name là 1 chuỗi cho nên kiểu đối số của nameQuery là 1 chuỗi, chứ không phải là 1 đối tượng Student.
  3. Do nameQuery là 1 danh sách chuỗi vì vậy biến vòng lặp foreach cũng phải là 1 chuỗi (string)

Hình tiếp theo mô tả sự chuyển đổi phức tạp hơn chút ít. Dữ liệu trả về là 1 kiểu không xác định với 2 thành viên có mặt trong đối tượng Student ban đầu.

  1. Đối số kiểu của nguồn dữ liệu định nghĩa kiểu của biến phạm vi.
  2. Bởi vì mệnh đề select sinh ra 1 kiểu không xác định, kiểu biến truy vấn phải hiểu ngầm bằng cách dùng từ khóa var.
  3. Vì kiểu biến truy vấn không rõ ràng, cho nên biến lặp trong vòng foreach cũng không rõ ràng (kiểu var).

Trình biên dịch suy luận kiểu dữ liệu truy vấn
Mặc dù chúng ta tốt nhất nên hiểu rõ về các dạng quan hệ truy vấn cũng như các kiểu dữ liệu kết quả, chúng ta cũng có lựa chọn là hãy để trình biên dịch làm tất cả công việc còn lại như hình phía trên. Từ khóa var được dùng cho bất cứ biến cục bộ nào trong 1 truy vấn. Trình biên dịch cung cấp các kiểu định nghĩa dữ liệu rõ ràng cho mỗi biến trong 1 truy vấn LINQ.

Kết luận: Bài viết cung cấp kiến thức về các dạng quan hệ trong các truy vấn LINQ cũng như cách sử dụng trình biên dịch để suy luận các kiểu dữ liệu sau khi thực thi truy vấn.

Bình luận Facebook

Để lại bình luận

Hãy là người đầu tiên bình luận!

Thông báo khi có
avatar
1000
wpDiscuz