Как вы запрашиваете набор объектов и в том же запросе фильтрует присоединенную коллекцию сущностей? - PullRequest
5 голосов
/ 13 января 2011

Я впервые использую Entity Framework и заметил, что объект entity возвращает коллекции сущностей.

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?

Реализуют ли IQueryable и ObjectSet, и EntityCollection?Я надеюсь, что они делают так, чтобы я знал, что запросы выполняются в источнике данных, а не в памяти.

РЕДАКТИРОВАТЬ: Так что, очевидно, EntityCollection не делает, пока ObjectSet делает.Означает ли это, что мне лучше использовать этот код?

    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 ]

3 голосов
/ 13 января 2011

ObjectSet<T> реализует IQueryable<T>, а EntityCollection<T> - нет.

Разница в том, что ObjectSet<T> предназначен для непосредственного запроса (именно поэтому он реализует интерфейс). EntityCollection<T>, с другой стороны, используется для конца "много" набора результатов, обычно возвращаемого в запросе, выполненном на ObjectSet<T>. Таким образом, он вызывает IEnumerable<T>, но не IQueryable<T> (поскольку это уже заполненные результаты запроса).

1 голос
/ 13 января 2011

Я был почти готов сказать да, они оба делают. К счастью, сначала я проверяю документацию .

EntityCollection не реализует IQueryable.

Что касается разницы, ObjectSet<TEntity> представляет объекты, сгенерированные из таблицы в базе данных. EntityCollection<TEntity> представляет коллекцию объектов-сущностей на стороне «многие» отношения «один ко многим» или «многие ко многим».

...