Como llamar un stored procedure desde Entity Framework 6 code first

publicado por: Anonymous

Estoy intentado llamar este stored procedure desde C#

alter PROCEDURE GetLecturasEnRangoDeFechas
-- Add the parameters for the stored procedure here
@fecha as smalldatetime,
@idParteMaquina int,
@inicio int,
@inicioMasDuracion int,
@dia smalldatetime
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

declare @inicioFecha as smalldatetime
set @inicioFecha=CONVERT(smalldatetime, DATEADD(s,@inicio,0))

declare @inicioMasDuracionFecha as smalldatetime
set @inicioMasDuracionFecha=CONVERT(smalldatetime, DATEADD(s,@inicioMasDuracion,0))

-- Insert statements for procedure here
select * from Lectura
where 
cast(Fecha as Date) =cast(@fecha As Date) and
[email protected] and
(Fecha>[email protected] and
Fecha<[email protected])
or
(@inicioMasDuracionFecha>@dia and
(@inicioFecha+Fecha<[email protected]))

END
GO

Codigo C#

using(ProduccionContexto pc=new ProduccionContexto())
{
 var lects=pc.Database.SqlQuery<Lectura>("GetLecturasEnRangoDeFechas",fecha,partemaquina.Id, inicio.TotalSeconds, inicioMasDuracion.TotalSeconds, dia);
}

Esto me arroja:

Procedure or function 'GetLecturasEnRangoDeFechas' expects parameter '@fecha', which was not supplied.

Y si lo hago asi:

using(ProduccionContexto pc=new ProduccionContexto())
{
 var lects=pc.Database.SqlQuery<Lectura>("GetLecturasEnRangoDeFechas @fecha,@idParteMaquina,@inicio,@inicioMasDuracion,@dia",fecha,partemaquina.Id, inicio.TotalSeconds, inicioMasDuracion.TotalSeconds, dia);
}

Me arroja:

Must declare the scalar variable "@fecha".

Cual es la sintaxis correcta para llamar un SP desde C# EF 6 CodeFirst

solución

Tienes que pasar los parámetros como un objeto SqlParameter, no es suficiente con los valores. Así:

var lects = pc.Database.SqlQuery<Lectura>(
    "GetLecturasEnRangoDeFechas @fecha, @idParteMaquina, @inicio, @inicioMasDuracion, @dia",
    new SqlParameter("@fecha",fecha),
    new SqlParameter("@idParteMaquina",partemaquina.Id),
    new SqlParameter("@inicio",inicio.TotalSeconds),
    new SqlParameter("@inicioMasDuracion",inicioMasDuracion.TotalSeconds),
    new SqlParameter("@dia",dia));

Entity Framework solo tiene acceso al valor, no tiene conocimiento de que la variable fecha debe ser asignada al parámetro @fecha.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *