如何查询对象集并在同一查询中筛选附加的实体集合?

时间:2011-01-13 17:35:08

标签: linq entity-framework entity-framework-4 linq-to-entities

我第一次使用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();

2 个答案:

答案 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>表示“一对多”或“多对多”关系的“多”侧的实体对象集合。