2013-01-04 29 views
5

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

7

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ế.

+0

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

+3

@JohnNevermore Nhìn vào phiên bản chung: http://msdn.microsoft.com/en-us/library/gg696460(v=vs.103).aspx – ken2k

+2

Silly me, hoàn toàn bỏ qua nó. Cảm ơn. – Dante

4

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(...) ...

Các vấn đề liên quan