Tốc độ xử lý của iqueryable và ienumerable
bởi Bạch Ngọc Toàn vào 15/06/2016. Lượt xem: 45,403 Show LINQ dùng để truy vấn dữ liệu từ cơ sở dữ liệu và các collection, chúng ta sử dụng IEnumerable và IQueryable để thao tác dữ liệu nhưng một số bạn vẫn chưa hiểu được sự khác nhau giữa 2 đối tượng này. IQueryable kế thừa IEnumerable, vì thế IQueryable có tất cả các đặc tính của IEnumerable và có thêm các đặc tính của riêng nó. Cả hai đều mang tính quan trọng khi truy vấn và thao tác dữ liệu. Chúng ta hãy cùng xem các tính năng của cả hai và so sánh chúng để dùng trong trường hợp nào cho hợp lý nhất nhé. IEnumerable
Ví dụ về IEnumerable
Câu lệnh của đoạn code trên sẽ gen ra như sau:
Chú ý là trong câu lệnh này “top 10” sẽ không có vì IEnumerable lọc các bản ghi ở dưới client. Nên toàn bộ số bản ghi trước khi load ra top 10 sẽ dc tải về client. IQueryable
Ví dụ về IQueryable
Câu lệnh gen ra sẽ như sau:
Chú ý: Câu lệnh trên có chữa “top 10” vì IQueryable thực thi câu lệnh và lọc dữ liệu trên server hoàn toàn. Chỉ khi gọi ToList() hoặc đưa vào duyệt thì nó mới thực thi. Tổng kếtTrong bài viết này mình cố gắng giải thích sự khác nhau giữa IEnumerable và IQueryable. Iqueryable giúp cho các bạn build câu lệnh và thực thi 1 lần trên server để trả về số bản ghi nhỏ nhất có thể. Còn IEnumerable giúp các bạn thao tác với các collection in-memory sẽ tốt hơn. Mình hy vọng sau khi đọc xong bài viết này các bạn có thể tăng khả năng sử dụng 2 đối tượng này giúp tăng performance. Nếu có feedback gì về bài viết vui lòng comment phía dưới. Trích nguồn từ: (dotnet-tricks.com) Như chúng ta đã biết, LINQ - Ngôn ngữ truy vấn tích hợp, được sử dụng để truy vấn dữ liệu từ một tập hợp dữ liệu. Tập hợp dữ liệu có thể là trong cơ sở dữ liệu hoặc collection trên bộ nhớ... Khi sử dụng LINQ, chúng ta có lẽ bắt gặp việc sử dụng IEnumerable và IQueryable rất nhiều nhưng lại chưa hiểu được sự khác biệt giữa chúng. Trong bài viết này, tôi sẽ chia sẻ với các bạn một số điểm lưu ý khi sử dụng 2 interface trên. Bài toán đặt raĐể thấy được sự khác biệt giữa 2 interface trên tôi sẽ sử dụng LINQ trong việc truy vấn dữ liệu từ cơ sở dữ liệu (Sql Server). Tôi có bảng Users với dữ liệu như sau: Bài toán đặt ra là hãy tìm các user có UserId >= 5. Tôi sử dụng Sql Server Profile để xác định câu lệnh truy vấn được gửi từ client tới server. Sự khác nhau giữa IEnumerable và IQueryableVề khái niệm của Về khái niệm của
Chúng ta hãy lưu ý đến cách thức truy vấn qua đoạn mã sau:
Cả 2 phần tìm kiếm đều trả về kết quả là:
Giờ chúng ta hãy mở Sql Profile và thấy Sql Engine thực hiện 2 câu lệnh như sau:
Khi thực hiện Khối 1.
Khi thực hiện Khối 2. Khi sử dụng IEnumerable, câu lệnh truy vấn sẽ thực hiện trên máy chủ và trả về dữ liệu cho client. Sau khi trả hết dữ liệu, client mới thực hiện lấy 2 bản ghi đầu tiên. Khi sử dụng IQueryable, câu lệnh truy vấn sẽ thực hiện trên máy chủ, lọc trên máy chủ và trả dữ liệu cho client. Trong điều kiện số bản ghi của bảng Users lớn thì việc sử dụng IEnumerable sẽ ảnh hưởng rất nhiều tới hiệu năng của ứng dụng cũng như của Sql Server. Tạm kếtĐến đây các bạn cũng đã hiểu sự khác nhau giữa IEnumerable và IQueryable. Rất mong sự góp ý nhỏ của mình sẽ có ích cho các bạn. |