Consulta y búsqueda de entidades

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.