Giả sử tôi muốn kiểm tra đơn vị lôgic truy vấn của Khung thực thể, một cách sẽ là chuyển đổi DbSet<T>
thành IQueryable<T>
trước khi xây dựng cây biểu thức để dễ dàng nhạo báng. Đây có phải là "an toàn" và có điều gì cần lưu ý không?Đang gọi AsQueryable <T> trên DbSet <T> "safe"?
Trả lời
Nó không chỉ an toàn, nó là hợp pháp và đầy đủ tiêu chuẩn. Đây là những gì OO là tất cả về. Bạn chỉ cần downcast. A DbSet
HAS là IQUeryable
, theo hợp đồng được xác định bởi nhà thiết kế.
Hãy cẩn thận với AsQueryable()
. Nếu một trong các biến của bạn thuộc loại IQueryable<IEntity>
sau khi gọi AsQueryable()
, bạn không biết loại biến thể bê tông nào là biến số (ví dụ DbSet<IEntity>
).
Trong khi nó hoàn toàn hợp lệ từ quan điểm OOP (đó là toàn bộ điểm của giao diện!), Nó có thể dẫn đến nhiều lỗi/lỗi. Hãy nhớ rằng cho đến khi bạn liệt kê một nguồn DbSet<IEntity>
, bạn không thực sự thực hiện truy vấn.
Đó là lý do tại sao ví dụ bạn có thể không tham gia vào một trong bộ nhớ IQueryable<IEntity>
(ví dụ new List<IEntity>{ ... }.AsQueryable()
) với kết quả của một DbSet<IEntity>
sử dụng .Union(...)
...
Về yếu hèn, nhìn vào http 5.0 tài liệu: // msdn.microsoft.com/en-us/library/system.data.entity.dbset(v=vs.103).aspx (không thể tìm thấy phiên bản 6.0), DbSet dường như không kế thừa từ IQueryable, đó là lý do tại sao nó có vẻ hơi cá đối với tôi. – Dante
@JohnNevermore Nhìn vào phiên bản chung: http://msdn.microsoft.com/en-us/library/gg696460(v=vs.103).aspx – ken2k
Silly me, hoàn toàn bỏ qua nó. Cảm ơn. – Dante