开发者

How do you query an object set and in that same query filter an attached entity collection?

I am using Entity Framework for the first time and noticed that the entities object returns entity collections.

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?

Do both ObjectSet and EntityCollection implement IQueryable? I am hoping they do so that I know the queries are getting executed at the data source and not in memory.

EDIT: So apparently EntityCollection does not while ObjectSet does. Does that mean I would be better off using this code?

    DBEntities db = new DBEntities();
    User user = db.Users.Where(x => x.Us开发者_开发问答ername == "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.

Also, what is the difference between ObjectSet and EntityCollection? Shouldn't they be the same?

Thanks in advance!

EDIT: Sorry, I'm new to this. I'm trying to understand. Attached EntityCollections are lazy loaded, so if I access them then memory is populated with them. Rather than doing two querys to the object sets like in my last edit, I am curious if this query would be more what I was after:

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


ObjectSet<T> does implement IQueryable<T>, but EntityCollection<T> does not.

The difference is that ObjectSet<T> is meant to be used for querying directly (which is why it does implement the interface). EntityCollection<T>, on the other hand, is used for the "many" end of a result set, typically returned in a query done on an ObjectSet<T>. As such, it impelments IEnumerable<T>, but not IQueryable<T> (as it's already the populated results of a query).


I was almost ready to say yes, they both do. Luckily I check the documentation first.

EntityCollection does not implement IQueryable.

As for the difference, ObjectSet<TEntity> represents the the objects generated from a table in a database. EntityCollection<TEntity> represents a collection of entity objects on the 'Many' side of One to Many or Many to Many relationship.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜