Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从实体框架核心调用存储过程获取一个_C#_Entity Framework_Asp.net Core_Entity Framework Core - Fatal编程技术网

C# 从实体框架核心调用存储过程获取一个

C# 从实体框架核心调用存储过程获取一个,c#,entity-framework,asp.net-core,entity-framework-core,C#,Entity Framework,Asp.net Core,Entity Framework Core,我正在尝试使用实体框架核心调用存储过程。存储过程有点复杂,所以我不使用LINQ 这是我的代码: using (IdentityProofContext dc = new IdentityProofContext()) { SqlParameter[] @params = { new SqlParameter("@result", SqlDbType.Int) {Direction = ParameterDirection.Ou

我正在尝试使用实体框架核心调用存储过程。存储过程有点复杂,所以我不使用LINQ

这是我的代码:

using (IdentityProofContext dc =  new IdentityProofContext())
{
    SqlParameter[] @params =
        {
            new SqlParameter("@result", SqlDbType.Int) {Direction = ParameterDirection.Output}
        };


    dc.IdentityPersonalData.FromSqlRaw("Execute usp_GetIdentityProofStatus", @params).FirstOrDefaultAsync();

    //var result = @params[0].Value;
    //if (result > 0)
    //{
    //    MiscEmails.sendEmails();
    //}
}
这是我的存储过程:

ALTER PROCEDURE usp_GetStatus
    (@result int OUTPUT)
AS
    SELECT @result = COUNT(*)
    FROM dbo.TestData
    WHERE DATEDIFF(MINUTE, DateInserted, GETDATE()) < 120 --Number of minutes
      AND STATUS IN ('test1' )

    RETURN @result

要使用普通字符串执行SQL查询,请改用ExecuteSqlRaw。对于使用插值字符串语法来创建参数的SQL查询的执行,请改用ExecuteSQLProtated


因为您的EFCore版本是5.0,所以方法
ExecuteSqlCommand
已经过时,所以您可以使用
ExecuteSqlRaw
executesqlimported
来替换它。

向DbContext添加一个方法,如下所示:

    public int GetStatus()
    {
        var result = new SqlParameter("@result", SqlDbType.Int) { Direction = ParameterDirection.Output };
        
        this.Database.ExecuteSqlCommand("exec usp_GetIdentityProofStatus @result out", result);

        return (int)result.Value;
    }
并且存储过程不应返回数据值。存储过程的返回值在成功时应为0,或者在失败时应引发错误

应该如此

ALTER PROCEDURE usp_GetStatus
    (@result int OUTPUT)
AS
BEGIN
    SELECT @result = COUNT(*)
    FROM dbo.TestData
    WHERE DATEDIFF(MINUTE, DateInserted, GETDATE()) < 120 --Number of minutes
      AND STATUS IN ('test1' )
END
更改程序usp\u GetStatus
(@result int-OUTPUT)
像
开始
选择@result=COUNT(*)
从dbo.TestData
其中DATEDIFF(分钟,DateInserted,GETDATE())<120——分钟数
和中的状态('test1')
终止

您不应该删除您的原始帖子,只需回复编辑或评论您是否仍在Entity Framework 3上?当前版本为6.2相对于IdentityPersonalData实体,结果代表什么?它需要地图。如果你不能映射它,只需使用Dapper,并通过在单个实体之外工作来避免头痛。我尝试这样做,但它仍然说你的问题很接近,问一个新的问题。我正在使用实体框架6.4.4我使用ExecuteSqlRaw而不是ExecuteSqlCommandThank。刚刚将ExecuteSQLCommand更改为ExecuteSqlRaw,它马上就可以工作了。
ALTER PROCEDURE usp_GetStatus
    (@result int OUTPUT)
AS
BEGIN
    SELECT @result = COUNT(*)
    FROM dbo.TestData
    WHERE DATEDIFF(MINUTE, DateInserted, GETDATE()) < 120 --Number of minutes
      AND STATUS IN ('test1' )
END