1

我的存储过程实现很简单:

create Procedure [dbo].[GetNegotiationInfo] (
    @negotiationId uniqueidentifier
) As

    select NegotiationId, SellerId from NegotiationMaster where negotiationId = @negotiationId

然后我希望在更新我的模型后编写以下代码。

   using (var db = new NegotiationContext())
            {
var query = db.GetNegotiationInfo(NegotiationId).FirstOrDefault();
}

但我收到错误“int 不包含 FirstOrDefault() 的定义”。我知道 Entity Framework 可能无法使用临时表等生成复杂的存储过程,但显然我的存储过程没有比这更简单的了。请注意,我的存储过程对于我的 StackOverflow 问题来说是基本的,而不是我将使用的实际存储过程。

4

3 回答 3

2

存储过程总是返回一个整数。这是存储过程调用的状态,NULL如果未在代码中指定,将设置为。一般的方法是0表示成功,任何其他值表示错误。 是有关该主题的一些文档。

如果要从存储过程返回值,请使用output参数。

或者,您可能需要一个用户定义的函数,该函数向调用者返回一个值。这可以是标量或表。

编辑:

我建议您查看用户定义的函数。

create function [dbo].[GetNegotiationInfo] (
    @negotiationId uniqueidentifier
)
returns table
As
    return(select NegotiationId, SellerId
           from NegotiationMaster
           where negotiationId = @negotiationId
          );

在 SQL 中,您可以将其称为:

select NegotiationId, SellerId
from dbo.GetNegotiationInfo(NegotiationId);

编辑(回应亚伦的评论):

本次讨论是关于仅 SQL 的存储过程。实体框架围绕存储过程包装东西。下面评论中提到的文档强烈建议 EF 应该从存储过程中的最后一个选择返回数据,但是您应该使用ExecuteFunction-- 令人困惑的是,即使这是一个存储过程。(在文档中搜索“导入返回实体以外的类型的存储过程”。)

于 2013-07-14T00:20:30.290 回答
1

在过程的顶部使用SET NOCOUNT ON,返回的整数几乎可以肯定是行数。

像这样:

ALTER Procedure [dbo].[GetNegotiationInfo] (
    @negotiationId uniqueidentifier
) As

SET NOCOUNT ON;

select  n.*, 
        s.firstname + ' ' + s.lastname sellername, 
        b.firstname + ' ' + b.lastname buyername,
        substring(s.firstname, 1, 1) + substring(s.lastname, 1, 1) as sellerinit,
        substring(b.firstname, 1, 1) + substring(b.lastname, 1, 1) as buyerinit,
        s.email selleremail, b.email buyeremail,
        a.ADDRESS1
from    negotiationMaster n
        inner join usermaster s on s.userid = n.sellerid
        inner join usermaster b on b.userid = n.buyerid
        inner join PropertyNegotiation p on p.NegotiationId = n.NegotiationId
        inner join MyOtherDb..PROPERTIES a on a.property_id = p.PropertyId
where   n.negotiationId = @negotiationId


return;
于 2013-07-14T00:02:24.897 回答
0

这一切都是关于在 Visual Studio 模型浏览器中编辑“函数导入”并为返回记录集创建一个复杂类型。请注意,存储过程中的临时表将难以被实体框架检查。见MSDN

于 2013-07-14T06:53:34.127 回答