Estoy utilizando Entity Framework por primera vez y noté que el objeto de entidades devuelve colecciones de entidades.¿Cómo se consulta un conjunto de objetos y en esa misma consulta se filtra una colección de entidades adjunta?
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?
¿Tanto ObjectSet como EntityCollection implementan IQueryable? Espero que lo hagan para que sepa que las consultas se ejecutan en la fuente de datos y no en la memoria.
EDIT: Así que al parecer no lo hace EntityCollection mientras ObjectSet hace. ¿Eso significa que sería mejor usar este código?
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.
Además, ¿cuál es la diferencia entre ObjectSet y EntityCollection? ¿No deberían ser lo mismo?
¡Gracias de antemano!
EDIT: Lo siento, soy nuevo en esto. Estoy tratando de entender. Las EntityCollections adjuntas están cargadas de forma diferida, por lo que si accedo a ellas, la memoria se rellena con ellas. En lugar de hacer dos querys a los conjuntos de objetos como en mi última edición, estoy ansioso por ver si esta consulta sería más lo que buscaba:
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();
Cualquiera que responda esto tendrá que hacer lo que debería haber hecho en lugar de publicar esta pregunta. Consejo, F12 lo llevará a la definición de una propiedad cuando el cursor está en el nombre de la propiedad y al tipo cuando el cursor está en el tipo. – Brian
No tiene que ser un listillo. – Chev