Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O Entity Framework permite-lhe consultar usando LINQ com as suas classes de entidade. No entanto, pode haver momentos em que queira executar consultas usando SQL bruto diretamente na base de dados. Isto inclui chamar procedimentos armazenados, o que pode ser útil para modelos Code First que atualmente não suportam mapeamento para procedimentos armazenados. As técnicas apresentadas neste tópico aplicam-se igualmente a modelos criados com o Code First e o EF Designer.
Escrita de consultas SQL para entidades
O método SqlQuery no DbSet permite escrever uma consulta SQL bruta que devolve instâncias de entidade. Os objetos devolvidos serão rastreados pelo contexto tal como seriam se fossem devolvidos por uma consulta LINQ. Por exemplo:
using (var context = new BloggingContext())
{
var blogs = context.Blogs.SqlQuery("SELECT * FROM dbo.Blogs").ToList();
}
Note-se que, tal como nas consultas LINQ, a consulta não é executada até que os resultados sejam enumerados — no exemplo acima isto é feito com a chamada para ToList.
Deve-se ter cuidado sempre que são escritas consultas SQL brutas por duas razões. Primeiro, a consulta deve ser escrita para garantir que apenas devolve entidades que sejam realmente do tipo solicitado. Por exemplo, ao usar funcionalidades como herança, é fácil escrever uma consulta que crie entidades do tipo errado de CLR.
Em segundo lugar, alguns tipos de consultas SQL brutas expõem potenciais riscos de segurança, especialmente em torno de ataques de injeção SQL. Certifica-te de que usas os parâmetros na tua consulta da forma correta para te protegeres contra esses ataques.
Carregamento de entidades a partir de procedimentos armazenados
Pode usar o DbSet.SqlQuery para carregar entidades a partir dos resultados de um procedimento armazenado. Por exemplo, o seguinte código chama o procedimento dbo.GetBlogs na base de dados:
using (var context = new BloggingContext())
{
var blogs = context.Blogs.SqlQuery("dbo.GetBlogs").ToList();
}
Também pode passar parâmetros a um procedimento armazenado usando a seguinte sintaxe:
using (var context = new BloggingContext())
{
var blogId = 1;
var blogs = context.Blogs.SqlQuery("dbo.GetBlogById @p0", blogId).Single();
}
Escrita de consultas SQL para tipos que não são entidades
Uma consulta SQL que retorna instâncias de qualquer tipo, incluindo tipos primitivos, pode ser criada usando o método SqlQuery na classe Database. Por exemplo:
using (var context = new BloggingContext())
{
var blogNames = context.Database.SqlQuery<string>(
"SELECT Name FROM dbo.Blogs").ToList();
}
Os resultados devolvidos pelo SqlQuery na Base de Dados nunca serão acompanhados pelo contexto, mesmo que os objetos sejam instâncias de um tipo de entidade.
Envio de comandos brutos para a base de dados
Comandos que não sejam de consulta podem ser enviados para a base de dados usando o método ExecuteSqlCommand na base de dados. Por exemplo:
using (var context = new BloggingContext())
{
context.Database.ExecuteSqlCommand(
"UPDATE dbo.Blogs SET Name = 'Another Name' WHERE BlogId = 1");
}
Note que quaisquer alterações feitas aos dados na base de dados usando o ExecuteSqlCommand são opacas ao contexto até que as entidades sejam carregadas ou recarregadas a partir da base de dados.
Parâmetros de saída
Se forem usados parâmetros de saída, os seus valores não estarão disponíveis até que os resultados tenham sido lidos na totalidade. Isto deve-se ao comportamento subjacente do DbDataReader, veja Recuperar Dados Usando um DataReader para mais detalhes.