Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este tópico aborda as várias maneiras de consultar dados usando o Entity Framework, incluindo LINQ e o método Find. As técnicas mostradas neste tópico se aplicam igualmente aos modelos criados com o Code First e o Designer EF.
Localizando entidades usando uma consulta
DbSet e IDbSet implementam IQueryable e, portanto, podem ser usados como ponto de partida para gravar uma consulta LINQ no banco de dados. Este não é o lugar apropriado para uma discussão detalhada do LINQ, mas aqui estão alguns exemplos simples:
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();
}
Observe que dbSet e IDbSet sempre criam consultas no banco de dados e sempre envolverão uma viagem de ida e volta ao banco de dados, mesmo que as entidades retornadas já existam no contexto. Uma consulta é executada no banco de dados quando:
- Ele é enumerado por uma instrução foreach (C#) ou For Each (Visual Basic).
- Ele é enumerado por uma operação de coleção como ToArray, ToDictionary ou ToList.
- Operadores LINQ, como First ou Any , são especificados na parte mais externa da consulta.
- Os métodos a seguir são chamados: o método de extensão Load em um DbSet, DbEntityEntry.Reload e Database.ExecuteSqlCommand.
Quando os resultados são retornados do banco de dados, os objetos que não existem no contexto são anexados ao contexto. Se um objeto já estiver no contexto, o objeto existente será retornado (os valores atuais e originais das propriedades do objeto na entrada não serão substituídos com valores de banco de dados).
Quando você executa uma consulta, as entidades que foram adicionadas ao contexto, mas ainda não foram salvas no banco de dados, não são retornadas como parte do conjunto de resultados. Para obter os dados que estão no contexto, consulte Dados Locais.
Se uma consulta não retornar linhas do banco de dados, o resultado será uma coleção vazia, em vez de nula.
Localizando entidades usando chaves primárias
O método Find no DbSet usa o valor da chave primária para tentar localizar uma entidade rastreada pelo contexto. Se a entidade não for encontrada no contexto, uma consulta será enviada ao banco de dados para localizar a entidade lá. Nulo será retornado se a entidade não for encontrada no contexto ou no banco de dados.
Encontrar é diferente de usar uma consulta de duas maneiras significativas:
- Uma viagem de ida e volta para o banco de dados só será feita se a entidade com a chave fornecida não for encontrada no contexto.
- Encontrar retornará entidades que estão com o status "Adicionado." Ou seja, Find retornará entidades que foram adicionadas ao contexto, mas que ainda não foram salvas no banco de dados.
Localizando uma entidade por chave primária
O código a seguir mostra alguns usos de Localizar:
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");
}
Localizando uma entidade por chave primária composta
O Entity Framework permite que suas entidades tenham chaves compostas, que é uma chave composta por mais de uma propriedade. Por exemplo, você pode ter uma entidade BlogSettings que representa as configurações de usuários para um blog específico. Como um usuário só teria um BlogSettings para cada blog, você poderia optar por tornar a chave primária do BlogSettings uma combinação de BlogId e Username. O código a seguir tenta localizar os BlogSettings com BlogId = 3 e Username = "johndoe1987":
using (var context = new BloggingContext())
{
var settings = context.BlogSettings.Find(3, "johndoe1987");
}
Observe que, quando você tem chaves compostas, precisa usar ColumnAttribute ou a API fluente para especificar uma ordenação para as propriedades da chave composta. A chamada para Localizar deve usar essa ordem ao especificar os valores que formam a chave.