Khó khăn khi sử dụng Tương lai với LINQ là các thao tác như Đếm thực hiện ngay lập tức.
Khi @vandalo phát hiện ra, Count()
sau ToFuture()
thực sự chạy Bộ đếm trong bộ nhớ, điều này rất tệ.
Cách duy nhất để tính số truy vấn LINQ trong tương lai là sử dụng GroupBy
trong trường bất biến. Một sự lựa chọn tốt sẽ là một cái gì đó đã là một phần của bộ lọc của bạn (như một tài sản "IsActive")
Dưới đây là một ví dụ giả sử bạn có một tài sản như vậy trong thanh toán:
//Create base query. Filters should be specified here.
var query = session.Query<Payment>().Where(x => x.IsActive == 1);
//Create a sorted, paged, future query,
//that will execute together with other statements
var futureResults = query.OrderByDescending(payment => payment.Created)
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToFuture();
//Create a Count future query based on the original one.
//The paged query will be sent to the server in the same roundtrip.
var futureCount = query.GroupBy(x => x.IsActive)
.Select(x => x.Count())
.ToFutureValue();
//Get the results.
var results = futureResults.ToArray();
var count = futureCount.Value;
Dĩ nhiên, sự lựa chọn là làm hai vòng, mà không phải là xấu anyway. Bạn vẫn có thể tái sử dụng IQueryable gốc, đó là hữu ích khi bạn muốn làm phân trang trong một lớp cấp cao hơn:
//Create base query. Filters should be specified here.
var query = session.Query<Payment>();
//Create a sorted, paged query,
var pagedQuery = query.OrderByDescending(payment => payment.Created)
.Skip((page - 1) * pageSize)
.Take(pageSize);
//Get the count from the original query
var count = query.Count();
//Get the results.
var results = pagedQuery.ToArray();
Cập nhật (2011/02/22): Tôi đã viết một blog post về vấn đề này và một giải pháp tốt hơn nhiều.
Nguồn
2011-02-11 12:00:33
Sử dụng Session.QueryOver thay - nó tiết kiệm IntelliSense và 'compileability', và có một phương pháp SelectCount. Nếu bạn cần tôi có thể cung cấp ví dụ chi tiết về việc sử dụng nó – Genius
Có, vui lòng, QueryOver dường như cũng hoạt động tốt! – Allrameest
(Tôi đã phát hiện lỗi trong giải pháp của mình và xóa lỗi đó để tránh nhầm lẫn. Tôi sẽ đăng phiên bản cố định ngay) –