Khi tôi đang đọc sách C# 6.0 in a Nutshell
. Dưới đây là ví dụ về AsEnumerable
trong sách.
Mục đích là để đúc một chuỗi IQueryable<T>
-IEnumerable<T>
, buộc các nhà khai thác truy vấn tiếp theo liên kết với các nhà khai thác Enumerable thay vì khai thác queryable. Điều này làm cho phần còn lại của truy vấn thực thi tại địa phương.
Để minh họa, giả sử chúng tôi có một bảng MedicalArticles
trong SQL Server và muốn sử dụng LINQ to SQL hoặc EF để truy xuất tất cả các bài viết về cúm có tóm tắt chứa ít hơn 100 từ. Đối với vị thứ hai, chúng ta cần một biểu thức chính quy:
Regex wordCounter = new Regex (@"\b(\w|[-'])+\b");
var query = dataContext.MedicalArticles
.Where (article => article.Topic == "influenza" &&
wordCounter.Matches (article.Abstract).Count < 100);
Vấn đề là SQL Server không hỗ trợ biểu thức thông thường, vì vậy các nhà cung cấp LINQ-to-db sẽ ném một ngoại lệ, phàn nàn rằng các truy vấn không thể được dịch sang SQL. Chúng ta có thể giải quyết việc này bằng cách truy vấn theo hai bước: đầu tiên lấy tất cả các bài viết về cúm thông qua một LINQ truy vấn SQL, và sau đó lọc nước cho tóm tắt dưới 100 chữ:
Regex wordCounter = new Regex (@"\b(\w|[-'])+\b");
IEnumerable<MedicalArticle> sqlQuery = dataContext.MedicalArticles
.Where (article => article.Topic == "influenza");
IEnumerable<MedicalArticle> localQuery = sqlQuery
.Where (article => wordCounter.Matches (article.Abstract).Count < 100);
Với AsEnumerable, chúng ta có thể làm tương tự trong một truy vấn:
var query = dataContext.MedicalArticles
.Where (article => article.Topic == "influenza")
.AsEnumerable()
.Where (article => wordCounter.Matches (article.Abstract).Count < 100);
Cách thay thế để gọi AsEnumerable là gọi ToArray hoặc ToList. Ưu điểm của AsEnumerable là nó không ép buộc thực thi truy vấn ngay lập tức, cũng như không tạo ra bất kỳ cấu trúc lưu trữ nào.
Điều này đúng - nhưng sẽ không chuyển sang 'IEnumerable' cung cấp cùng một kết quả? –
Tôi tìm thấy 'Table.AsEnumerable(). Where (somePredicate)' để dễ đọc hơn nhiều so với '((IEnumerable) Table) .Where (somePredicate)'. –
jason
Chúng tôi biết nó dễ đọc hơn, nhưng chúng có tương đương không? –