C# 实体框架-存储过程返回值

C# 实体框架-存储过程返回值,c#,sql,entity-framework,stored-procedures,C#,Sql,Entity Framework,Stored Procedures,我试图获取存储过程的返回值。以下是此类存储过程的示例: select Name, IsEnabled from dbo.something where ID = @ID if @@rowcount = 0 return 1 return 这是一个简单的选择。如果找到0行,我的结果集将为null,但仍有返回值 这是一个糟糕的示例,因为这是一个select,所以如果返回了0行,我肯定可以找到。但是,在Insert、delete或其他调用中,我们需

我试图获取存储过程的返回值。以下是此类存储过程的示例:

select
    Name,
    IsEnabled
from
    dbo.something
where
    ID = @ID

if @@rowcount = 0
    return 1    

return
这是一个简单的选择。如果找到0行,我的结果集将为null,但仍有返回值

这是一个糟糕的示例,因为这是一个select,所以如果返回了0行,我肯定可以找到。但是,在Insert、delete或其他调用中,我们需要这个返回值来知道是否有问题。我一直无法找到获取此返回值的方法。我可以得到输出值,可以得到结果集,但没有返回值

如果我手动调用SQL,或者即使我使用实体框架运行
SqlCommand
,我也可以得到返回值,但这不是我想要做的

是否有人能够使用实体框架从存储过程中获取返回值


谢谢你的帮助

否。实体框架没有丰富的存储过程支持,因为它是ORM,而不是SQL替代品


正如您已经发现的那样,如果您需要使用存储过程的不太常见(更高级?)的功能,那么您必须使用老式的ADO.NET。

为了在EF中获得感兴趣的结果,您应该返回相同的结构(不是1和名称,IsEnabled) 在此查询中,您应该返回“”,例如0,而不是if条件中的1:

select Name, IsEnabled from dbo.something where ID = @ID if @@rowcount = 0 return '',0 选择 名称 我迷路了 从…起 dbo什么的 哪里 ID=@ID 如果@@rowcount=0 返回“”,0
我已经能够使用EntityFramework5(但我认为它在版本4.x中可以工作)使用代码优先的方法获得返回值(以及输出和输入参数)。从你的帖子中,我看不到你使用的是什么版本的EF以及你是如何进行映射的;如果您考虑使用代码第一的方法,您可以找到解决方案:

我想存储过程返回值的支持取决于实体框架的版本。虽然直接返回值对我来说不起作用,但我还是设法使用输出存储过程参数来获取值。例如:

USE [YOUR_DB_NAME]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[TestReturnValue]
    @InputValue int = 0,
    @Result int OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    SELECT @Result  = @InputValue
    RETURN(@InputValue);
END
这是测试代码:

void TestReturnValue()
{
    using (var db = new YourDBContext())
    {
        var result = new System.Data.Objects.ObjectParameter("Result", 0);
        Console.WriteLine("SP returned {0}", db.TestReturnValue(123, result));
        Console.WriteLine("Output param {0}", result.Value);
    }
}
这就是输出:

SP returned -1
Output param 123
正如您看到的,直接返回的值输出有些垃圾,但输出参数工作

希望这有帮助

您必须使用“Context.Database.SqlQuery”,并指定存储过程的输出类型

        var spReturnVaue = Context.Database.SqlQuery<Type>("[schema].YourSp").FirstOrDefault();

        int firstId = Context.Database.SqlQuery<int>("[dbo].GetFirstId").FirstOrDefault();
var-spReturnVaue=Context.Database.SqlQuery(“[schema].YourSp”).FirstOrDefault();
int firstId=Context.Database.SqlQuery(“[dbo].GetFirstId”).FirstOrDefault();

Entity Framework是一种ORM,并不打算完全替换应用程序对数据库的所有调用。如果我手动调用SQL,或者即使我使用Entity Framework运行SQLCommand,我也可以得到返回值-这就是你的答案。@Lamak-哎呀,我错了,我在50%以下看到它,并假设它是最差的。若要添加此项:@@rowcount将返回一个标量值,或者就此而言,任何select@value都将返回一个标量值。如果您已经有一个结果集,这将添加一个新的结果集。目前,4.0不支持多个结果集,但带有EF的框架4.5将支持多个结果集。这与问题有关吗?