2012-02-12 27 views

Trả lời

20

Bạn đã bị hiểu sai.

IEnumerable sẽ sử dụng LINQ cho đối tượng, tất cả các phương pháp được thực hiện trên đối tượng trong bộ nhớ. - IQueryable sẽ sử dụng bất cứ điều gì thực hiện các phương pháp mở rộng LINQ được cung cấp bởi nhà cung cấp cụ thể. Trong trường hợp này (một kho lưu trữ), tôi đoán nó rất có thể là một nhà cung cấp ánh xạ các biểu thức LINQ tới các câu lệnh cơ sở dữ liệu.

Điều đó có nghĩa nếu bạn sử dụng IQueryable:

IQueryable<People> list = repository.FindAllPeople; 
int count = list.Count(); 

Số đếm được xác định trên cơ sở dữ liệu riêng của mình, ví dụ như một truy vấn "select count(*) from People". Điều này thường rất, rất nhanh.

Nếu bạn sử dụng IEnumerable:

IEnumerable<People> list = repository.FindAllPeople; 
int count = list.Count(); 

Tất cả các trường dân sẽ được cụ thể hóa vào bộ nhớ từng người một trong khi LINQ to đối tượng được lặp lại thông qua việc thu thập để xác định số lượng. Điều này sẽ rất chậm và nên tránh bất cứ khi nào có thể.

Vì không phải tất cả các cuộc gọi phương thức đều có thể được ánh xạ tới truy vấn cơ sở dữ liệu đôi khi không thể tránh được khi sử dụng IEnumerable, nhưng tất cả việc lọc, nối và nhóm phải được thực hiện trên IQueryable nếu có thể, sau đó là bước cuối cùng bạn có thể sử dụng AsEnumerable() các phương thức mở rộng để chuyển sang sử dụng IEnumerable và LINQ đối với các đối tượng.

+0

Không có trong trường hợp của tôi, số lượng chạy trên tài liệu excel không phải là rất tốt cho hiệu suất. 300-400ms cho khoảng 350 hàng. Cảm ơn lời giải thích của bạn mặc dù. Giúp tôi hiểu tại sao nó quá chậm. –

0

Tôi không quen với tính không thể xử lý của IQueryable, nhưng this blog post dường như chỉ ra rằng IQueryable thích hợp hơn với IEnumerable vì IQueryable cho phép truy cập vào biểu thức cơ bản.

Điều này chỉ có thể có liên quan trong trường hợp điều khoản Where và không ảnh hưởng .Count().

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