IEnumerable<T>
đại diện cho một con trỏ về phía trước chỉ của T
. .NET 3.5 đã thêm các phương thức mở rộng bao gồm LINQ standard query operators
như Where
và First
, với bất kỳ toán tử nào yêu cầu vị từ hoặc hàm ẩn danh lấy Func<T>
.
IQueryable<T>
thực hiện cùng một toán tử truy vấn chuẩn LINQ, nhưng chấp nhận Expression<Func<T>>
cho các vị từ và hàm ẩn danh. Expression<T>
là một cây biểu hiện được biên dịch, một phiên bản bị hỏng của phương thức ("được biên dịch một nửa" nếu bạn muốn) có thể được phân tích cú pháp bởi nhà cung cấp truy vấn và được sử dụng cho phù hợp.
Ví dụ:
IEnumerable<Person> people = GetEnumerablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();
IQueryable<Person> people = GetQueryablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();
Trong khối đầu tiên, x => x.Age > 18
là một phương pháp vô danh (Func<Person, bool>
), có thể được thực hiện giống như bất kỳ phương pháp nào khác. Enumerable.Where
sẽ thực thi phương thức một lần cho mỗi người, yield
giá trị ing mà phương thức trả về true
.
Trong khối thứ hai, x => x.Age > 18
là cây biểu thức (Expression<Func<Person, bool>>
), có thể được coi là "thuộc tính 'Độ tuổi'> 18".
Điều này cho phép những thứ như LINQ-to-SQL tồn tại vì chúng có thể phân tích cú pháp cây biểu thức và chuyển đổi nó thành SQL tương đương. Và bởi vì nhà cung cấp không cần thực thi cho đến khi IQueryable
được liệt kê (nó thực hiện IEnumerable<T>
, sau cùng), nó có thể kết hợp nhiều toán tử truy vấn (trong ví dụ trên Where
và FirstOrDefault
) để thực hiện các lựa chọn thông minh hơn về cách thực hiện toàn bộ truy vấn so với nguồn dữ liệu cơ bản (như sử dụng SELECT TOP 1
trong SQL).
Xem:
Nguồn
2010-03-12 14:33:49
"truy vấn có thể được chuyển đổi thành sql": Tôi không nhận được 'có thể'. Ngoài ra, nếu tôi có một IEnumerable và tạo ra một 'chuỗi phức tạp' thì (rõ ràng) không giống như IQueryable, nó sẽ không được dịch sang truy vấn SQL 'tối ưu hóa'. Chỉ muốn xác nhận ý nghĩa của nó khi bạn nói 'tất cả các hàng sẽ được kéo vào bộ nhớ'. Hãy để chúng tôi nói rằng tôi có hai điều khoản, sau đó tất cả các bộ dữ liệu của các thực thể đầu tiên được lấy vào bộ nhớ và sau đó bộ lọc 'trong bộ nhớ' bình thường sẽ xảy ra? – Vaibhav