Tôi đã thấy rất nhiều dự án có kho lưu trữ trả về các thể hiện của IQueryable
. Điều này cho phép các bộ lọc bổ sung và sắp xếp có thể được thực hiện trên IQueryable
mã khác, dịch sang các SQL khác nhau được tạo. Tôi tò mò mô hình này đến từ đâu và liệu nó có phải là một ý tưởng tốt.
Mối quan tâm lớn nhất của tôi IQueryable
là một lời hứa sẽ tấn công cơ sở dữ liệu một thời gian sau đó, khi nó được liệt kê. Điều này có nghĩa là một lỗi sẽ được ném ra bên ngoài kho lưu trữ. Điều này có thể có nghĩa là một ngoại lệ Entity Framework được ném vào một lớp khác của ứng dụng.
Tôi cũng đã gặp phải các vấn đề với Nhiều bộ kết quả hoạt động (MARS) trong quá khứ (đặc biệt là khi sử dụng giao dịch) và cách tiếp cận này có vẻ như sẽ dẫn đến điều này xảy ra thường xuyên hơn.
Tôi đã luôn gọi AsEnumerable
hoặc ToArray
ở cuối mỗi biểu thức LINQ của mình để đảm bảo cơ sở dữ liệu được nhấn trước khi rời khỏi mã kho lưu trữ.
Tôi tự hỏi nếu trả về IQueryable
có thể hữu ích như một khối xây dựng cho một lớp dữ liệu. Tôi đã thấy một số mã khá xa hoa với một kho lưu trữ gọi một kho lưu trữ khác để xây dựng một kho thậm chí còn lớn hơn IQueryable
.
where
mệnh đề vào hoãn lại IQueryable
, bạn chỉ phải gửi dữ liệu đó qua dây chứ không phải toàn bộ tập kết quả.