5

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

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

+1

No tiene que ser un listillo. – Chev

Respuesta

3

ObjectSet<T> implementa IQueryable<T>, pero EntityCollection<T> no lo hace.

La diferencia es que ObjectSet<T> está destinado a ser utilizado para consultar directamente (razón por la cual implementa la interfaz). EntityCollection<T>, por otro lado, se utiliza para el "muchos" final de un conjunto de resultados, generalmente devuelto en una consulta realizada en un ObjectSet<T>. Como tal, impulsa IEnumerable<T>, pero no IQueryable<T> (ya que ya son los resultados poblados de una consulta).

+0

Entonces, cuando consulto user.Posts consulto una colección en memoria? – Chev

+0

@Chevex: Exactamente. 'db.Users.Where' hace una consulta, que devuelve al usuario. Desde que se devuelve al usuario, todos sus "Publicaciones" ya se han transferido. –

+0

@Chevex: Tendría que insertar estos en una sola consulta, si no desea que sea local. –

1

que estaba a punto de decir que sí, ambos hacen. Afortunadamente, primero compruebo the documentation.

EntityCollection no implementa IQueryable.

En cuanto a la diferencia, ObjectSet<TEntity> representa los objetos generados a partir de una tabla en una base de datos. EntityCollection<TEntity> representa una colección de objetos de entidad en el lado 'Muchos' de la relación Uno a Muchos o Muchos a Muchos.

+0

Estaba escribiendo exactamente lo mismo cuando recibí la barra "alguien más respondió a esta pregunta". Parece que debería, pero supongo que no. – Jeff

+0

Acepto, parece que las colecciones de entidades no se deben cargar de inmediato. ¿Eso significa que cada vez que llego a un objeto de usuario también obtengo todas las publicaciones? ¡Esto es horrible! Eso significa que una consulta de usuario está consultando todas las publicaciones de ese usuario, incluso si no tengo la intención de acceder a ellas. Cojo. Reconsiderando el marco de entidad ahora. – Chev

Cuestiones relacionadas