Solución:
Puede utilizar el método FromSQL:
var blogs = context.Blogs
.FromSql("EXECUTE dbo.GetMostPopularBlogs")
.ToList();
https://docs.microsoft.com/en-us/ef/core/querying/raw-sql
Para salvar a alguien más una hora más o menos …
La respuesta de ErikEJ funciona perfectamente, pero primero tenía un trabajo extra que hacer.
Después de una primera migración de código inverso (a una base de datos existente con procedimientos almacenados), tuve un problema en el que los procedimientos almacenados en una base de datos existente no devolvían la tabla estándar (por ejemplo, lista de Blog
), pero una clase diferente (por ejemplo, lista de BlogTitleAndSummary
) que no estaba en la base de datos (y por lo tanto la migración).
Esta publicación decía que la devolución debe ser un tipo de entidad, del cual no estaba seguro, pero otra de las publicaciones de Eriks me indicó la dirección correcta.
Para que este escenario funcione:
Creé una clase de ‘BlogTitleAndSummary’, marqué una propiedad como [key]
.
p.ej
public class BlogTitleAndSummary
{
[Key]
public int BlogId { get; set; }
public string Title { get; set; }
public string ShortSummary { get; set; }
}
Luego, lo agregué como un DbSet en el contexto, por ejemplo
public partial class BloggingContext : DbContext
{
public BloggingContext()
{
}
public BloggingContext(DbContextOptions<BloggingContext> options)
: base(options)
{
}
// Might be best to move these to another partial class, so they don't get removed in any updates.
public virtual DbSet<BlogTitleAndSummary> BlogTitleAndSummary { get; set; }
// Standard Tables
public virtual DbSet<Blog> Blog { get; set; }
...
}
Esto me permitió usar la siguiente sintaxis para llamar a procedimientos almacenados:
NOTA: He actualizado esto siguiendo el comentario a continuación. Utilice los parámetros en el método FromSql. No utilice la interpolación de cadenas para este tipo de consultas SQL.
using (var ctx = new BloggingContext())
{
var dbResults = ctx.BlogTitleAndSummary.FromSql("EXEC dbo.get_bloggingSummary @UserId={0}", userId).ToList();
}