5

Tôi đang sử dụng khung Entity lần đầu tiên và nhận thấy rằng đối tượng thực thể trả về các bộ sưu tập thực thể.Làm thế nào để bạn truy vấn một bộ đối tượng và trong cùng một bộ lọc truy vấn đó là một bộ sưu tập thực thể được đính kèm?

DBEntities db = new DBEntities(); 
db.Users; //Users is an ObjectSet<User> 
User user = db.Users.Where(x => x.Username == "test").First(); //Is this getting executed in the SQL or in memory? 
user.Posts; //Posts is an EntityCollection<Post> 
Post post = user.Posts.Where(x => x.PostID == "123").First(); //Is this getting executed in the SQL or in memory? 

Cả hai ObjectSet và EntityCollection có thực thi IQueryable không? Tôi hy vọng họ làm như vậy mà tôi biết các truy vấn đang được thực hiện tại nguồn dữ liệu và không phải trong bộ nhớ.

EDIT: Vì vậy, EntityCollection rõ ràng không trong khi ObjectSet thực hiện. Điều đó có nghĩa là tôi sẽ sử dụng mã này tốt hơn?

DBEntities db = new DBEntities(); 
    User user = db.Users.Where(x => x.Username == "test").First(); //Is this getting executed in the SQL or in memory? 
    Post post = db.Posts.Where(x => (x.PostID == "123")&&(x.Username == user.Username)).First(); // Querying the object set instead of the entity collection. 

Ngoài ra, sự khác biệt giữa ObjectSet và EntityCollection là gì? Chẳng phải chúng giống nhau sao?

Cảm ơn trước!

EDIT: Xin lỗi, tôi mới làm quen với điều này. Tôi đang cố để hiểu. Các EntityCollections được đính kèm sẽ được tải xuống, vì vậy nếu tôi truy cập chúng thì bộ nhớ sẽ được phổ biến với chúng. Thay vì làm hai querys đến bộ đối tượng như trong chỉnh sửa cuối cùng của tôi, tôi tò mò nếu truy vấn này sẽ được nhiều hơn những gì tôi đã sau:

DBEntities db = new DBEntities(); 
User user = (from x in db.Users 
      from y in x.Posts 
      where x.Username == "test" 
      where y.PostID == 123 
      select x).First(); 
+0

Bất kỳ ai trả lời câu hỏi này đều phải làm những gì bạn nên làm thay vì đăng câu hỏi này. Mẹo, F12 sẽ đưa bạn đến định nghĩa của thuộc tính khi con trỏ trên tên thuộc tính và loại khi con trỏ có trên loại. – Brian

+1

Bạn không cần phải là một smartass. – Chev

Trả lời

3

ObjectSet<T> hiện thực hiện IQueryable<T>, nhưng EntityCollection<T> thì không.

Sự khác biệt là ObjectSet<T> có nghĩa là được sử dụng để truy vấn trực tiếp (đó là lý do tại sao nó thực hiện giao diện). Mặt khác, EntityCollection<T> được sử dụng cho kết thúc "nhiều" của tập kết quả, thường được trả lại trong truy vấn được thực hiện trên ObjectSet<T>. Như vậy, nó impelments IEnumerable<T>, nhưng không phải IQueryable<T> (vì nó đã là kết quả phổ biến của một truy vấn).

+0

Vì vậy, khi tôi truy vấn người dùng.Posts Tôi đang truy vấn bộ sưu tập trong bộ nhớ? – Chev

+0

@Chevex: Chính xác. 'db.Users.Where' thực hiện truy vấn trả về người dùng. Vì người dùng được trả về, tất cả "Bài đăng" của nó đã được kéo qua. –

+0

@Chevex: Bạn cần phải đẩy chúng vào một truy vấn duy nhất, nếu bạn không muốn kéo nó cục bộ. –

1

tôi đã gần như sẵn sàng để nói có, cả hai đều làm. May mắn tôi kiểm tra the documentation trước.

EntityCollection không triển khai IQueryable.

Đối với sự khác biệt, ObjectSet<TEntity> đại diện cho các đối tượng được tạo từ một bảng trong cơ sở dữ liệu. EntityCollection<TEntity> đại diện cho một bộ sưu tập các đối tượng thực thể ở bên 'Nhiều' của mối quan hệ Một hoặc Nhiều hoặc Nhiều đến Nhiều.

+0

Tôi chỉ đang viết lên gần như cùng một điều chính xác khi tôi nhận được thanh "một người khác màu cam trả lời câu hỏi này". Có vẻ như nó nên, nhưng tôi đoán là không. – Jeff

+0

Tôi đồng ý, có vẻ như Bộ sưu tập thực thể không được tải ngay lập tức. Điều đó có nghĩa là mỗi lần cư trú một đối tượng người dùng tôi nhận được tất cả các bài viết quá !!! ??? Thật kinh khủng! Điều đó có nghĩa là một truy vấn người dùng đang truy vấn tất cả các bài đăng của người dùng đó ngay cả khi tôi không có ý định truy cập chúng. Què. Xem xét lại khung pháp nhân ngay bây giờ. – Chev

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