C# EF5从返回列表或不返回任何内容的存储过程中收集数据

C# EF5从返回列表或不返回任何内容的存储过程中收集数据,c#,entity-framework,tsql,C#,Entity Framework,Tsql,我有一个如下所示的存储过程: CREATE PROCEDURE [dbo].[Foo] ( @ID INT, @PARAM1 NVARCHAR(10), @Error INT OUT ) AS BEGIN IF (@ID < 0) BEGIN SET @Error = 1 RETURN END IF (@ID > 100) BEGIN SET @Error = 2 RETURN END SELECT Fie

我有一个如下所示的存储过程:

CREATE PROCEDURE [dbo].[Foo]
(
  @ID INT,
  @PARAM1 NVARCHAR(10),
  @Error INT OUT
)
AS 
BEGIN
  IF (@ID < 0)
  BEGIN
    SET @Error = 1
    RETURN
  END

  IF (@ID > 100)
  BEGIN
    SET @Error = 2
    RETURN
  END

  SELECT Field1, Field2, Field3 FROM TABLE WHERE Param = @PARAM1
END
创建过程[dbo].[Foo]
(
@ID INT,
@PARAM1 NVARCHAR(10),
@错误输入输出
)
作为
开始
如果(@ID<0)
开始
设置@Error=1
返回
结束
如果(@ID>100)
开始
设置@Error=2
返回
结束
从Param=@PARAM1的表中选择Field1、Field2、Field3
结束
在EF5中,我这样称呼它

ObjectParameter error = new ObjectParameter("Error", typeof(global::System.Int32));
List<MyFoo> list = db.Foo(id, param1, error).ToList();
ObjectParameter error=newobjectparameter(“error”,typeof(global::System.Int32));
List=db.Foo(id,param1,error).ToList();
代码没有编译,因为并非所有路径都返回一个值,这是有意义的,因为我在存储过程中有几个
“RETURN”
调用

问题:
从EF5调用此存储过程的正确方法是什么(无法更改存储过程)


提前感谢

从SP中删除
错误
参数并
返回
s,并用于发出错误信号。确保严重性大于10,这样它将抛出SqlException,但小于17,这样它就不会是系统问题,并报告给DB管理员:

CREATE PROCEDURE [dbo].[Foo]
(
  @ID INT,
  @PARAM1 NVARCHAR(10)
)
AS 
BEGIN
  IF (@ID < 0)
  BEGIN
    RAISERROR('ID is less than 0', 16, 0); 
  END

  IF (@ID > 100)
  BEGIN
    RAISERROR('ID is greater than 100', 16, 0); 
  END

  SELECT Field1, Field2, Field3 FROM TABLE WHERE Param = @PARAM1
END
创建过程[dbo].[Foo]
(
@ID INT,
@PARAM1 NVARCHAR(10)
)
作为
开始
如果(@ID<0)
开始
RAISERROR('ID小于0',16,0);
结束
如果(@ID>100)
开始
RAISERROR('ID大于100',16,0);
结束
从Param=@PARAM1的表中选择Field1、Field2、Field3
结束

由于存储过程在中间有返回状态,所以它是MOR ILKE动态SQL。我非常怀疑EF与DB上下文将一起工作。我认为最好使用常规的ExeCudieDADER方法。如果正常执行,这个链接会有助于存储的Pro实际工作吗?我猜你可能需要一个
SET@Error=0
newline
RETURN
,在该过程结束时,它才能与EF一起工作……但我没有太多处理它们,所以我可能是错的。@FizzBuzz存储过程就是这样工作的是的…@Krishnannijeevan博客作者似乎有一个输出参数未填充的问题,我的问题是,正如您所说,存储过程并不总是返回列表。可能有一个解决方案是用SELECT“as field1”、“as field2…”替换返回另一个选择是在EF中完成所有操作。除非您只提供实际存储过程的一个片段,否则根本没有理由拥有它。该方法不处理查询,只检查参数并返回查询结果。编写一个接受2个参数并返回完整或空列表的方法要简单得多。