我第一次使用Entity Framework,并注意到entities对象返回实体集合。
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?
ObjectSet和EntityCollection都实现了IQueryable吗?我希望他们这样做,我知道查询是在数据源而不是在内存中执行的。
编辑:显然,当ObjectSet执行时,EntityCollection不会。这是否意味着我最好使用这段代码?
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.
另外,ObjectSet和EntityCollection有什么区别?它们不应该是一样的吗?
提前致谢!
编辑:抱歉,我是新来的。我想了解一下。附加的EntityCollections是延迟加载的,所以如果我访问它们,那么就会用它们填充内存。而不是像我上次编辑那样对对象集进行两次查询,我很好奇这个查询是否会更像我之后:
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 :(得分:3)
ObjectSet<T>
确实实施了IQueryable<T>
,但EntityCollection<T>
没有实现。
不同之处在于ObjectSet<T>
意味着直接用于查询(这就是它实现接口的原因)。另一方面,EntityCollection<T>
用于结果集的“多”端,通常在ObjectSet<T>
上完成的查询中返回。因此,它会促使IEnumerable<T>
,但不会IQueryable<T>
(因为它已经是查询的填充结果)。
答案 1 :(得分:1)
我几乎准备好说是,他们都这样做。幸运的是,我先检查the documentation。
EntityCollection未实现IQueryable。
至于差异,ObjectSet<TEntity>
表示从数据库中的表生成的对象。 EntityCollection<TEntity>
表示“一对多”或“多对多”关系的“多”侧的实体对象集合。