Depende se você está usando EF Core 2.1 ou EF Core 3 e versões superiores .
Se você estiver usando EF Core 2.1
Se estiver usando o EF Core 2.1 Release Candidate 1 disponível desde 7 de maio de 2018, você pode aproveitar as vantagens do novo recurso proposto, que é o tipo de consulta.
Qual é o tipo de consulta ?
Além dos tipos de entidade, um modelo EF Core pode conter tipos de consulta, que podem ser usados para realizar consultas de banco de dados contra dados que não estão mapeados para tipos de entidade.
Quando usar o tipo de consulta?
Servindo como o tipo de retorno para consultas ad hoc FromSql ().
Mapeamento para visualizações de banco de dados.
Mapeamento para tabelas que não possuem uma chave primária definida.
Mapeamento para consultas definidas no modelo.
Assim, você não precisa mais fazer todos os hacks ou soluções alternativas propostas como respostas à sua pergunta. Basta seguir estas etapas:
Primeiro você definiu uma nova propriedade de tipo DbQuery<T>
onde T
é o tipo da classe que carregará os valores da coluna de sua consulta SQL. Então, em seu DbContext
você terá isto:
public DbQuery<SomeModel> SomeModels { get; set; }
Em segundo lugar, use o FromSql
método como você faz com DbSet<T>
:
var result = context.SomeModels.FromSql("SQL_SCRIPT").ToList();
var result = await context.SomeModels.FromSql("SQL_SCRIPT").ToListAsync();
Observe também que DdContext
s são classes parciais , portanto, você pode criar um ou mais arquivos separados para organizar suas definições 'DbQuery SQL bruto' da maneira que melhor lhe convier.
Se você estiver usando EF Core 3.0 e versões superiores
O tipo de consulta agora é conhecido como tipo de entidade sem chave . Como dito acima, os tipos de consulta foram introduzidos no EF Core 2.1. Se você estiver usando EF Core 3.0 ou versão superior, você deve agora considerar o uso de tipos de tntity sem chave porque os tipos de consulta agora estão marcados como obsoletos.
Este recurso foi adicionado ao EF Core 2.1 com o nome de tipos de consulta. No EF Core 3.0, o conceito foi renomeado para tipos de entidade sem chave. A anotação de dados [sem chave] tornou-se disponível no EFCore 5.0.
Ainda temos os mesmos cenários dos tipos de consulta para quando usar o tipo de entidade sem chave.
Então, para usá-lo, você precisa primeiro marcar sua classe SomeModel
com [Keyless]
anotação de dados ou por meio de configuração fluente com .HasNoKey()
chamada de método como abaixo:
public DbSet<SomeModel> SomeModels { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<SomeModel>().HasNoKey();
}
Após essa configuração, você pode usar um dos métodos explicados aqui para executar sua consulta SQL. Por exemplo, você pode usar este:
var result = context.SomeModels.FromSqlRaw("SQL SCRIPT").ToList();