2010-04-20 33 views
15

Tôi đã nhìn thấy rất nhiều người nói về IQueryable và tôi đã không hoàn toàn nhận được những gì tất cả các buzz là về. Tôi luôn luôn làm việc với chung của List 's và thấy họ rất phong phú trong cách bạn có thể "truy vấn" họ và làm việc với họ, thậm chí chạy LINQ truy vấn đối với họ.Thỏa thuận lớn với IQueryable là gì?

Tôi tự hỏi nếu có lý do chính đáng để bắt đầu xem xét một bộ sưu tập mặc định khác trong các dự án của tôi.

+0

'IQueryable' về cơ bản là khác nhau từ 'List' - cả hai đều có sử dụng của họ. –

Trả lời

42

Giao diện IQueryable cho phép bạn xác định các phần của truy vấn đối với nhà cung cấp LINQ từ xa (thường chống lại cơ sở dữ liệu, nhưng không nhất thiết) trong nhiều bước và thực thi chậm.

Ví dụ: lớp cơ sở dữ liệu của bạn có thể xác định một số hạn chế (ví dụ: dựa trên quyền, bảo mật - bất kỳ điều gì) bằng cách thêm mệnh đề .Where(x => x.......) vào truy vấn của bạn. Nhưng điều này vẫn chưa được thực hiện - ví dụ: bạn đang không phải truy xuất 150'000 hàng phù hợp với tiêu chí đó. Thay vào đó, bạn chuyển giao giao diện IQueryable sang cấp độ tiếp theo, lớp doanh nghiệp, nơi bạn có thể thêm yêu cầu bổ sung và điều khoản vào truy vấn của bạn - một lần nữa, không có gì được thực hiện ngay, bạn cũng không được tung ra 80'000 trong số 150'000 hàng bạn đã truy xuất - bạn chỉ xác định các tiêu chí truy vấn bổ sung.

Và lớp giao diện người dùng có thể thực hiện tương tự, ví dụ: dựa trên đầu vào của người dùng trong biểu mẫu hoặc nội dung nào đó.

Điều kỳ diệu là bạn đang đi qua giao diện IQueryable qua tất cả các lớp, thêm critieria bổ sung vào nó - nhưng nó không được thực thi/đánh giá cho đến khi bạn thực sự ép buộc nó. Điều này cũng có nghĩa là bạn không cần phải lựa chọn và truy xuất tấn dữ liệu mà bạn sẽ loại bỏ sau đó. Bạn có thể không thực sự làm điều đó với một danh sách tĩnh cổ điển - bạn phải chọn dữ liệu, có thể loại bỏ rất nhiều nó một lần nữa sau này trong quá trình - bạn có một danh sách tĩnh, sau khi tất cả.

+2

+1 Câu trả lời rất mô tả ... –

7

IQueryable cho phép bạn thực hiện truy vấn bằng LINQ, giống như truy vấn LINQ to Object, nơi các truy vấn thực sự được "biên dịch" và chạy ở nơi khác.

Các triển khai phổ biến nhất hoạt động với cơ sở dữ liệu. Nếu bạn sử dụng List<T> và LINQ to Objects, bạn tải toàn bộ "bảng" dữ liệu vào bộ nhớ, sau đó chạy truy vấn của bạn với nó.

Bằng cách sử dụng IQueryable<T>, LINQ cung cấp có thể "dịch" câu lệnh LINQ của bạn thành mã SQL thực tế và chạy nó trên cơ sở dữ liệu. Các kết quả có thể được trả lại cho bạn và liệt kê.

Điều này hiệu quả hơn nhiều, đặc biệt nếu bạn đang làm việc trong các hệ thống N-tầng.

4

Truy vấn LINQ chống lại IEnumerable<T> tạo các đại biểu (phương pháp) mà khi được gọi, thực hiện truy vấn được mô tả.

Truy vấn LINQ chống lại IQueryable<T> tạo expression trees, cấu trúc dữ liệu đại diện cho mã tạo truy vấn. Các nhà cung cấp LINQ như LINQ to SQL giải thích các cấu trúc dữ liệu này, tạo ra cùng một truy vấn trên nền tảng đích (T-SQL trong trường hợp này).

Đối với một ví dụ về cách trình biên dịch giải thích cú pháp truy vấn đối với IQueryable<T>, xem câu trả lời của tôi cho câu hỏi này:

Building Dynamic LINQ Queries based on Combobox Value

Các vấn đề liên quan