使用Entity Framework 6无法获得存储过程结果

ale*_*lex 5 c# sql-server stored-procedures entity-framework entity-framework-6

我有一个存储过程,该存储过程根据数据库中是否存在指定的电子邮件地址返回一个0或一个1

CREATE PROCEDURE [DatabaseSchema].[EmailAddressIsDuplicate] (@emailAddress nvarchar(255))
AS
BEGIN
    SET NOCOUNT ON;

    IF EXISTS(
        SELECT *
        FROM [DatabaseSchema].[EmailUpdatesRegistrant]
        WHERE EmailAddress = @emailAddress
    )
        RETURN 1
    ELSE
        RETURN 0

    RETURN 0
END

GO
Run Code Online (Sandbox Code Playgroud)

我正在尝试从Entity Framework 6数据库上下文派生此存储过程的结果:

using (DatabaseContext dbContext = new DatabaseContext())
{
    ObjectParameter param = new ObjectParameter("emailAddress", typeof(bool));
    var result = dbContext.EmailAddressIsDuplicate(emailAddress); 
}
Run Code Online (Sandbox Code Playgroud)

我遇到很多错误。

错误1:使用上述代码,var result始终设置为-1。

错误2:我尝试导航到Edit Function Import并将其设置Returns a Collection OfBoolean标量值。这将引发以下错误:

商店数据提供者返回的数据读取器没有足够的列用于请求的查询。

错误#3:我返回并将Edit Function Import返回值设置为None。然后我从这个答案中尝试了以下代码:

using (DatabaseContext dbContext = new DatabaseContext())
{
    var p = new SqlParameter("@emailAddress", emailAddress);
    var result = dbContext.Database.SqlQuery<bool>("DatabaseSchema.EmailAddressIsDuplicate", p);
}
Run Code Online (Sandbox Code Playgroud)

没有立即引发错误,但是我不知道是否可以从中获取有用的数据var result。尝试投放resultbool引发以下错误:

无法将类型'System.Data.Entity.Infrastructure.DbRawSqlQuery'转换为'bool'

关于如何查看此存储过程(01)结果的任何想法?

Dan*_*Dev 2

@result您可以尝试在存储过程签名中添加输出参数 ( ):

CREATE PROCEDURE [DatabaseSchema].[EmailAddressIsDuplicate]
    (@emailAddress nvarchar(255), @result bit out)
AS
BEGIN
    SET NOCOUNT ON;

    IF EXISTS(SELECT *
              FROM [DatabaseSchema].[EmailUpdatesRegistrant]
              WHERE EmailAddress = @emailAddress)
       SET @result = 1
    ELSE
       SET @result = 0

    RETURN @result
END
GO
Run Code Online (Sandbox Code Playgroud)

(您必须相应地重新定义 EF 模型函数定义)

using (DatabaseContext dbContext = new DatabaseContext())
{
    ObjectParameter isDuplicate = new ObjectParameter("isDuplicate", typeof(bool)); 
    var result = dbContext.EmailAddressIsDuplicate(emailAddress, isDuplicate);

    bool emailIsDuplicate = (bool)isDuplicate.Value;.    
}
Run Code Online (Sandbox Code Playgroud)

如果您想直接使用输出参数调用存储过程,您可以遵循以下建议: Database.SqlQuery 调用具有多个输出参数的存储过程