Tôi có một phương pháp 'không dịch sang SQL' mà tôi muốn thực hiện trên IQueryable, có cách nào để buộc IQueryable thực thi mà không cần lưu trữ nó trong một số lớp trung gian không?Buộc một IQueryable để thực thi?
Trả lời
Có phải vấn đề mà bạn muốn phương pháp thực thi cục bộ thay vì trong cơ sở dữ liệu không? Nếu vậy, AsEnumerable
là bạn của bạn. Đó là một phương pháp rất đơn giản, một cái gì đó như:
public IEnumerable<T> AsEnumerable(IEnumerable<T> source)
{
return source;
}
Điều quan trọng là nó làm cho các loại thời gian biên dịch của kết quả IEnumerable<T>
hơn IQueryable<T>
, có nghĩa là bất kỳ nhà khai thác truy vấn LINQ bạn gọi sau đó sẽ là LINQ với các đối tượng thay vì LINQ to SQL.
Ví dụ:
var query = context.Employees
// Filtering performed in SQL
.Where(emp => emp.IsFullTime)
.AsEnumerable()
// Projection performed locally; ComputeSalary has no
// SQL equivalent
.Select(emp => new { Employee = emp,
Salary = ComputeSalary(emp) });
Bạn có thể gọi ToList
như đề xuất ở nơi khác, nhưng nếu bạn đang thực hiện lọc và không thực sự cần danh sách đầy đủ trong bộ nhớ, gọi AsEnumerable
và lọc rằng kết quả sẽ hiệu quả hơn tải mọi thứ trước tiên.
Liệu kỹ thuật này với LINQ to EF là tốt? Nó không có vẻ như vậy. – neontapir
Tôi không hiểu những gì 'thực thi cục bộ hơn là trong cơ sở dữ liệu'. Đối với những người như tôi: IQueryable
@Tymek: Có, thực thi hai truy vấn SQL. Nhưng bằng cách "thực hiện cục bộ", tôi có nghĩa là "lấy tất cả các kết quả trong truy vấn từ cơ sở dữ liệu, nhưng sau đó thực hiện phần còn lại của truy vấn trong bộ nhớ" - vì vậy bạn có thể thực hiện lọc, dự vv mà không thể áp dụng trong SQL. –
List<Employees> myEmployees = myqueryable.ToList();
và sau đó bạn có thể thực hiện công cụ LINQ của mình trên Danh sách đó.
Bạn nhận được thông báo đó khi bạn đã viết một truy vấn mà LinqToSql không biết làm thế nào để dịch sang SQL (đó là những gì nó nói quá).
Tôi không chắc chắn tôi nhận được chính xác những gì bạn đang yêu cầu, nhưng như xa như tôi thấy, bạn có các tùy chọn sau:
- Viết lại câu hỏi của bạn để LinqToSql THỂ dịch nó
- Hãy làm như phần lớn các truy vấn như bạn có thể trên Sql server, sau đó làm phần còn lại trong bộ nhớ (sử dụng LINQ to Objects)
- Sit xuống và khóc
Giả sử chúng ta loại trừ # 3, chúng ta hãy nhìn vào những khác 2 ví dụ.
Viết lại - để trợ giúp điều đó, chúng tôi cần truy vấn LINQ của bạn.
Tại đây bạn lấy phần không thể dịch được từ truy vấn ban đầu, sau đó trên ToList gọi hàm Iqueryable và sau đó áp dụng phần còn lại của truy vấn trên danh sách đó.
Và bạn có thể thực hiện truy vấn mà không phải lưu trữ truy vấn không? Vâng, không thực sự, bạn luôn có thể lặp qua các kết quả và như vậy không lưu trữ nó trong một biến, nhưng rõ ràng là kết quả của truy vấn cần được lưu trữ ở đâu đó.
Người ta không cần ngồi xuống khóc. – mayu
Rất đúng - tuy nhiên tôi cảm thấy không có người nào phải khóc khi đứng. Nếu bạn phải khóc, bạn cần phải làm điều đó đúng cách. – kastermester
- 1. có chuyển đổi IQueryable thành IEnumerable để thực thi lại truy vấn không?
- 2. Có cách nào để buộc một before_filter luôn thực thi cuối cùng không?
- 3. Bắt buộc thực thi giao diện chung trong C#
- 4. boost :: program_options - Có thể thực thi cờ bắt buộc không?
- 5. Làm cách nào để thực thi một tệp thực thi được nhúng dưới dạng tài nguyên
- 6. jQuery - ràng buộc và thực thi một trình xử lý đơn lẻ?
- 7. Làm cách nào để thực thi ràng buộc xác thực trên thuộc tính của thực thể có thể nhúng?
- 8. Windows Lua để thực thi
- 9. Tại sao một số lệnh được thực thi trong các ràng buộc tham số chung?
- 10. Thêm một nơi/trật tự bởi khoản để một IQueryable
- 11. Làm cách nào để buộc tải lại tập lệnh và thực thi lại?
- 12. XSD.exe không thực thi minOccurs
- 13. Làm thế nào để bắt buộc Javascript thực thi trong phản hồi HTML với Ajax Request
- 14. Làm thế nào để tạo một phar thực thi?
- 15. Mất bao lâu để một tập lệnh thực thi?
- 16. Chạy một thực thi plugin Maven đơn lẻ?
- 17. Tạo một lớp tùy chỉnh IQueryable
- 18. Công cụ để thực thi đoạn mã
- 19. gprof và lập luận để thực thi
- 20. NHibernate - Thực thi SQL để điền DTO
- 21. Làm thế nào để bắt buộc một sự kiện để thực hiện trong MySQL
- 22. Hashset vs IQueryable
- 23. OData mà không IQueryable
- 24. Tại sao bằng cách sử dụng Đếm với IQueryable được coi là không khả thi
- 25. Truyền IQueryable <EntityObject> đến IQueryable <Specific>
- 26. Bạn có thể tự động tạo tệp mysqldump không thực thi ràng buộc khoá ngoại không?
- 27. SQLAlchemy - không thực thi ràng buộc khóa ngoài đối với mối quan hệ
- 28. Sử dụng Automapper để trả lại IQueryable
- 29. Thực thi truy vấn bắt buộc mà không cần tuôn ra/cam kết
- 30. Chuyển đổi IQueryable tổng quát để JSON
Đây là một chẩn đoán mù nhưng nếu string.IsNullOrEmpty là thủ phạm sau đó sử dụng 2 nơi mệnh đề thay thế: .Where (o => o.Name! = Null) .Where (o => o.Name.Length> 0) . – mayu