C# 从实体框架核心调用存储过程获取一个
我正在尝试使用实体框架核心调用存储过程。存储过程有点复杂,所以我不使用LINQ 这是我的代码: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
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