Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tema se describen las distintas formas en que puede consultar datos mediante Entity Framework, incluido LINQ y el método Find. Las técnicas que se muestran en este tema se aplican igualmente a los modelos creados con Code First y EF Designer.
Búsqueda de entidades mediante una consulta
DbSet e IDbSet implementan IQueryable, por lo que se pueden usar como punto de partida para escribir una consulta LINQ en la base de datos. Este no es el lugar adecuado para una explicación detallada de LINQ, pero estos son un par de ejemplos sencillos:
using (var context = new BloggingContext())
{
// Query for all blogs with names starting with B
var blogs = from b in context.Blogs
where b.Name.StartsWith("B")
select b;
// Query for the Blog named ADO.NET Blog
var blog = context.Blogs
.Where(b => b.Name == "ADO.NET Blog")
.FirstOrDefault();
}
Tenga en cuenta que DbSet e IDbSet siempre crean consultas en la base de datos y siempre implican un recorrido de ida y vuelta a la base de datos incluso si las entidades devueltas ya existen en el contexto. Una consulta se ejecuta en la base de datos cuando:
- Se enumera mediante una instrucción foreach (C#) o For Each (Visual Basic).
- Se enumera mediante una operación de recopilación como ToArray, ToDictionary o ToList.
- Los operadores LINQ, como First o Any , se especifican en la parte más externa de la consulta.
- Se llama a los métodos siguientes: el método de extensión Load en un DbSet, DbEntityEntry.Reload y Database.ExecuteSqlCommand.
Cuando se devuelven los resultados de la base de datos, los objetos que no existen en el contexto se adjuntan al contexto. Si un objeto ya está en el contexto, se devuelve el objeto existente (los valores actuales y originales de las propiedades del objeto en la entrada no se sobrescriben con valores de base de datos).
Al realizar una consulta, las entidades que se han agregado al contexto, pero que aún no se han guardado en la base de datos no se devuelven como parte del conjunto de resultados. Para obtener los datos que están en el contexto, consulte Datos locales.
Si una consulta no devuelve ninguna fila de la base de datos, el resultado será una colección vacía, en lugar de null.
Búsqueda de entidades mediante claves principales
El método Find de DbSet usa el valor de clave principal para intentar buscar una entidad que el contexto está rastreando. Si la entidad no se encuentra en el contexto, se enviará una consulta a la base de datos para encontrar la entidad allí. Se devuelve null si la entidad no se encuentra en el contexto o en la base de datos.
El comando "Buscar" se diferencia del uso de una consulta en dos formas importantes:
- Solo se realizará un recorrido de ida y vuelta a la base de datos si la entidad con la clave especificada no se encuentra en el contexto.
- La función Buscar devuelve las entidades en estado Agregado. Es decir, Find devolverá entidades que se han agregado al contexto, pero que aún no se han guardado en la base de datos.
Búsqueda de una entidad por clave principal
En el código siguiente se muestran algunos usos de Find:
using (var context = new BloggingContext())
{
// Will hit the database
var blog = context.Blogs.Find(3);
// Will return the same instance without hitting the database
var blogAgain = context.Blogs.Find(3);
context.Blogs.Add(new Blog { Id = -1 });
// Will find the new blog even though it does not exist in the database
var newBlog = context.Blogs.Find(-1);
// Will find a User which has a string primary key
var user = context.Users.Find("johndoe1987");
}
Búsqueda de una entidad por clave principal compuesta
Entity Framework permite que las entidades tengan claves compuestas, es decir, una clave formada por más de una propiedad. Por ejemplo, podría tener una entidad BlogSettings que represente una configuración de usuarios para un blog determinado. Dado que un usuario solo tendría un BlogSettings para cada blog, podrías optar por hacer que la clave principal de BlogSettings sea una combinación de BlogId y Username. El código siguiente intenta encontrar BlogSettings con BlogId = 3 y Username = "johndoe1987":
using (var context = new BloggingContext())
{
var settings = context.BlogSettings.Find(3, "johndoe1987");
}
Tenga en cuenta que, cuando tenga claves compuestas, debe usar ColumnAttribute o la API fluida para especificar una ordenación para las propiedades de la clave compuesta. La llamada a Find debe usar este orden al especificar los valores que forman la clave.